firmware.c 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
  4. * All rights reserved.
  5. *
  6. * File: baseband.c
  7. *
  8. * Purpose: Implement functions to access baseband
  9. *
  10. * Author: Yiching Chen
  11. *
  12. * Date: May 20, 2004
  13. *
  14. * Functions:
  15. *
  16. * Revision History:
  17. *
  18. */
  19. #include <linux/compiler.h>
  20. #include "firmware.h"
  21. #include "usbpipe.h"
  22. #define FIRMWARE_VERSION 0x133 /* version 1.51 */
  23. #define FIRMWARE_NAME "vntwusb.fw"
  24. #define FIRMWARE_CHUNK_SIZE 0x400
  25. int vnt_download_firmware(struct vnt_private *priv)
  26. {
  27. struct device *dev = &priv->usb->dev;
  28. const struct firmware *fw;
  29. int status;
  30. void *buffer = NULL;
  31. bool result = false;
  32. u16 length;
  33. int ii, rc;
  34. dev_dbg(dev, "---->Download firmware\n");
  35. rc = request_firmware(&fw, FIRMWARE_NAME, dev);
  36. if (rc)
  37. goto out;
  38. buffer = kmalloc(FIRMWARE_CHUNK_SIZE, GFP_KERNEL);
  39. if (!buffer)
  40. goto free_fw;
  41. for (ii = 0; ii < fw->size; ii += FIRMWARE_CHUNK_SIZE) {
  42. length = min_t(int, fw->size - ii, FIRMWARE_CHUNK_SIZE);
  43. memcpy(buffer, fw->data + ii, length);
  44. status = vnt_control_out(priv,
  45. 0,
  46. 0x1200 + ii,
  47. 0x0000,
  48. length,
  49. buffer);
  50. dev_dbg(dev, "Download firmware...%d %zu\n", ii, fw->size);
  51. if (status != STATUS_SUCCESS)
  52. goto free_fw;
  53. }
  54. result = true;
  55. free_fw:
  56. release_firmware(fw);
  57. out:
  58. kfree(buffer);
  59. return result;
  60. }
  61. MODULE_FIRMWARE(FIRMWARE_NAME);
  62. int vnt_firmware_branch_to_sram(struct vnt_private *priv)
  63. {
  64. int status;
  65. dev_dbg(&priv->usb->dev, "---->Branch to Sram\n");
  66. status = vnt_control_out(priv,
  67. 1,
  68. 0x1200,
  69. 0x0000,
  70. 0,
  71. NULL);
  72. return status == STATUS_SUCCESS;
  73. }
  74. int vnt_check_firmware_version(struct vnt_private *priv)
  75. {
  76. int status;
  77. status = vnt_control_in(priv,
  78. MESSAGE_TYPE_READ,
  79. 0,
  80. MESSAGE_REQUEST_VERSION,
  81. 2,
  82. (u8 *)&priv->firmware_version);
  83. dev_dbg(&priv->usb->dev, "Firmware Version [%04x]\n",
  84. priv->firmware_version);
  85. if (status != STATUS_SUCCESS) {
  86. dev_dbg(&priv->usb->dev, "Firmware Invalid.\n");
  87. return false;
  88. }
  89. if (priv->firmware_version == 0xFFFF) {
  90. dev_dbg(&priv->usb->dev, "In Loader.\n");
  91. return false;
  92. }
  93. dev_dbg(&priv->usb->dev, "Firmware Version [%04x]\n",
  94. priv->firmware_version);
  95. if (priv->firmware_version < FIRMWARE_VERSION) {
  96. /* branch to loader for download new firmware */
  97. vnt_firmware_branch_to_sram(priv);
  98. return false;
  99. }
  100. return true;
  101. }