diff mbox series

[v4] Bluetooth: btusb: Add support using different nvm for variant WCN6855 controller

Message ID 1629709100-9099-1-git-send-email-zijuhu@codeaurora.org (mailing list archive)
State Superseded
Headers show
Series [v4] Bluetooth: btusb: Add support using different nvm for variant WCN6855 controller | expand

Commit Message

Zijun Hu Aug. 23, 2021, 8:58 a.m. UTC
From: Tim Jiang <tjiang@codeaurora.org>

we have variant wcn6855 soc chip from different vendors, so we should
use different nvm file with suffix to distinguish them.

Signed-off-by: Tim Jiang <tjiang@codeaurora.org>
---
 drivers/bluetooth/btusb.c | 46 ++++++++++++++++++++++++++++++++++++----------
 1 file changed, 36 insertions(+), 10 deletions(-)

Comments

bluez.test.bot@gmail.com Aug. 23, 2021, 10:05 a.m. UTC | #1
This is automated email and please do not reply to this email!

Dear submitter,

Thank you for submitting the patches to the linux bluetooth mailing list.
This is a CI test results with your patch series:
PW Link:https://patchwork.kernel.org/project/bluetooth/list/?series=535741

---Test result---

Test Summary:
CheckPatch                    PASS      0.68 seconds
GitLint                       FAIL      0.15 seconds
BuildKernel                   FAIL      434.73 seconds
TestRunner: Setup             PASS      466.74 seconds
TestRunner: l2cap-tester      PASS      3.32 seconds
TestRunner: bnep-tester       PASS      2.24 seconds
TestRunner: mgmt-tester       PASS      34.76 seconds
TestRunner: rfcomm-tester     PASS      2.55 seconds
TestRunner: sco-tester        PASS      2.42 seconds
TestRunner: smp-tester        FAIL      2.49 seconds
TestRunner: userchan-tester   PASS      2.27 seconds

Details
##############################
Test: CheckPatch - PASS - 0.68 seconds
Run checkpatch.pl script with rule in .checkpatch.conf


##############################
Test: GitLint - FAIL - 0.15 seconds
Run gitlint with rule in .gitlint
Bluetooth: btusb: Add support using different nvm for variant WCN6855 controller
1: T1 Title exceeds max length (80>72): "Bluetooth: btusb: Add support using different nvm for variant WCN6855 controller"


##############################
Test: BuildKernel - FAIL - 434.73 seconds
Build Kernel with minimal configuration supports Bluetooth
drivers/bluetooth/btusb.c: In function ‘btusb_generate_qca_nvm_name’:
drivers/bluetooth/btusb.c:3344:27: warning: argument to ‘sizeof’ in ‘snprintf’ call is the same expression as the destination; did you mean to provide an explicit length? [-Wsizeof-pointer-memaccess]
 3344 |    snprintf(fwname, sizeof(fwname), "qca/nvm_usb_%08x%s%s.bin",
      |                           ^
drivers/bluetooth/btusb.c:3344:13: error: passing argument 1 of ‘snprintf’ from incompatible pointer type [-Werror=incompatible-pointer-types]
 3344 |    snprintf(fwname, sizeof(fwname), "qca/nvm_usb_%08x%s%s.bin",
      |             ^~~~~~
      |             |
      |             char **
In file included from ./include/linux/list.h:9,
                 from ./include/linux/dmi.h:5,
                 from drivers/bluetooth/btusb.c:9:
./include/linux/kernel.h:204:20: note: expected ‘char *’ but argument is of type ‘char **’
  204 | int snprintf(char *buf, size_t size, const char *fmt, ...);
      |              ~~~~~~^~~
drivers/bluetooth/btusb.c:3349:27: warning: argument to ‘sizeof’ in ‘snprintf’ call is the same expression as the destination; did you mean to provide an explicit length? [-Wsizeof-pointer-memaccess]
 3349 |    snprintf(fwname, sizeof(fwname), "qca/nvm_usb_%08x%s%s%04x.bin",
      |                           ^
drivers/bluetooth/btusb.c:3349:13: error: passing argument 1 of ‘snprintf’ from incompatible pointer type [-Werror=incompatible-pointer-types]
 3349 |    snprintf(fwname, sizeof(fwname), "qca/nvm_usb_%08x%s%s%04x.bin",
      |             ^~~~~~
      |             |
      |             char **
In file included from ./include/linux/list.h:9,
                 from ./include/linux/dmi.h:5,
                 from drivers/bluetooth/btusb.c:9:
./include/linux/kernel.h:204:20: note: expected ‘char *’ but argument is of type ‘char **’
  204 | int snprintf(char *buf, size_t size, const char *fmt, ...);
      |              ~~~~~~^~~
drivers/bluetooth/btusb.c:3356:26: warning: argument to ‘sizeof’ in ‘snprintf’ call is the same expression as the destination; did you mean to provide an explicit length? [-Wsizeof-pointer-memaccess]
 3356 |   snprintf(fwname, sizeof(fwname), "qca/nvm_usb_%08x.bin",
      |                          ^
drivers/bluetooth/btusb.c:3356:12: error: passing argument 1 of ‘snprintf’ from incompatible pointer type [-Werror=incompatible-pointer-types]
 3356 |   snprintf(fwname, sizeof(fwname), "qca/nvm_usb_%08x.bin",
      |            ^~~~~~
      |            |
      |            char **
In file included from ./include/linux/list.h:9,
                 from ./include/linux/dmi.h:5,
                 from drivers/bluetooth/btusb.c:9:
./include/linux/kernel.h:204:20: note: expected ‘char *’ but argument is of type ‘char **’
  204 | int snprintf(char *buf, size_t size, const char *fmt, ...);
      |              ~~~~~~^~~
drivers/bluetooth/btusb.c: In function ‘btusb_setup_qca_load_nvm’:
drivers/bluetooth/btusb.c:3373:32: error: passing argument 1 of ‘btusb_generate_qca_nvm_name’ from incompatible pointer type [-Werror=incompatible-pointer-types]
 3373 |    btusb_generate_qca_nvm_name(&fwname, sizeof(fwname), ver, "_", "gf");
      |                                ^~~~~~~
      |                                |
      |                                char (*)[64]
drivers/bluetooth/btusb.c:3335:48: note: expected ‘char **’ but argument is of type ‘char (*)[64]’
 3335 | static void btusb_generate_qca_nvm_name(char **fwname,
      |                                         ~~~~~~~^~~~~~
drivers/bluetooth/btusb.c:3376:32: error: passing argument 1 of ‘btusb_generate_qca_nvm_name’ from incompatible pointer type [-Werror=incompatible-pointer-types]
 3376 |    btusb_generate_qca_nvm_name(&fwname, sizeof(fwname), ver, NULL, NULL);
      |                                ^~~~~~~
      |                                |
      |                                char (*)[64]
drivers/bluetooth/btusb.c:3335:48: note: expected ‘char **’ but argument is of type ‘char (*)[64]’
 3335 | static void btusb_generate_qca_nvm_name(char **fwname,
      |                                         ~~~~~~~^~~~~~
cc1: some warnings being treated as errors
make[2]: *** [scripts/Makefile.build:271: drivers/bluetooth/btusb.o] Error 1
make[1]: *** [scripts/Makefile.build:514: drivers/bluetooth] Error 2
make: *** [Makefile:1841: drivers] Error 2


##############################
Test: TestRunner: Setup - PASS - 466.74 seconds
Setup environment for running Test Runner


##############################
Test: TestRunner: l2cap-tester - PASS - 3.32 seconds
Run test-runner with l2cap-tester
Total: 40, Passed: 40 (100.0%), Failed: 0, Not Run: 0

##############################
Test: TestRunner: bnep-tester - PASS - 2.24 seconds
Run test-runner with bnep-tester
Total: 1, Passed: 1 (100.0%), Failed: 0, Not Run: 0

##############################
Test: TestRunner: mgmt-tester - PASS - 34.76 seconds
Run test-runner with mgmt-tester
Total: 448, Passed: 445 (99.3%), Failed: 0, Not Run: 3

##############################
Test: TestRunner: rfcomm-tester - PASS - 2.55 seconds
Run test-runner with rfcomm-tester
Total: 9, Passed: 9 (100.0%), Failed: 0, Not Run: 0

##############################
Test: TestRunner: sco-tester - PASS - 2.42 seconds
Run test-runner with sco-tester
Total: 8, Passed: 8 (100.0%), Failed: 0, Not Run: 0

##############################
Test: TestRunner: smp-tester - FAIL - 2.49 seconds
Run test-runner with smp-tester
Total: 8, Passed: 7 (87.5%), Failed: 1, Not Run: 0

Failed Test Cases
SMP Client - SC Request 2                            Failed       0.028 seconds

##############################
Test: TestRunner: userchan-tester - PASS - 2.27 seconds
Run test-runner with userchan-tester
Total: 3, Passed: 3 (100.0%), Failed: 0, Not Run: 0



---
Regards,
Linux Bluetooth
kernel test robot Aug. 23, 2021, 1:58 p.m. UTC | #2
Hi Zijun,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on bluetooth-next/master]
[also build test WARNING on linus/master v5.14-rc7 next-20210823]
[cannot apply to linux/master bluetooth/master]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url:    https://github.com/0day-ci/linux/commits/Zijun-Hu/Bluetooth-btusb-Add-support-using-different-nvm-for-variant-WCN6855-controller/20210823-170111
base:   https://git.kernel.org/pub/scm/linux/kernel/git/bluetooth/bluetooth-next.git master
config: alpha-allyesconfig (attached as .config)
compiler: alpha-linux-gcc (GCC) 11.2.0
reproduce (this is a W=1 build):
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # https://github.com/0day-ci/linux/commit/0e2a1544bcc7d3ffac1bd4c27614c8d892933ed3
        git remote add linux-review https://github.com/0day-ci/linux
        git fetch --no-tags linux-review Zijun-Hu/Bluetooth-btusb-Add-support-using-different-nvm-for-variant-WCN6855-controller/20210823-170111
        git checkout 0e2a1544bcc7d3ffac1bd4c27614c8d892933ed3
        # save the attached .config to linux build tree
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-11.2.0 make.cross ARCH=alpha 

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>

All warnings (new ones prefixed by >>):

   drivers/bluetooth/btusb.c: In function 'btusb_generate_qca_nvm_name':
>> drivers/bluetooth/btusb.c:3342:48: warning: argument to 'sizeof' in 'snprintf' call is the same expression as the destination; did you mean to provide an explicit length? [-Wsizeof-pointer-memaccess]
    3342 |                         snprintf(fwname, sizeof(fwname), "qca/nvm_usb_%08x%s%s.bin",
         |                                                ^
   drivers/bluetooth/btusb.c:3342:34: error: passing argument 1 of 'snprintf' from incompatible pointer type [-Werror=incompatible-pointer-types]
    3342 |                         snprintf(fwname, sizeof(fwname), "qca/nvm_usb_%08x%s%s.bin",
         |                                  ^~~~~~
         |                                  |
         |                                  char **
   In file included from include/linux/list.h:9,
                    from include/linux/dmi.h:5,
                    from drivers/bluetooth/btusb.c:9:
   include/linux/kernel.h:204:20: note: expected 'char *' but argument is of type 'char **'
     204 | int snprintf(char *buf, size_t size, const char *fmt, ...);
         |              ~~~~~~^~~
   drivers/bluetooth/btusb.c:3347:48: warning: argument to 'sizeof' in 'snprintf' call is the same expression as the destination; did you mean to provide an explicit length? [-Wsizeof-pointer-memaccess]
    3347 |                         snprintf(fwname, sizeof(fwname), "qca/nvm_usb_%08x%s%s%04x.bin",
         |                                                ^
   drivers/bluetooth/btusb.c:3347:34: error: passing argument 1 of 'snprintf' from incompatible pointer type [-Werror=incompatible-pointer-types]
    3347 |                         snprintf(fwname, sizeof(fwname), "qca/nvm_usb_%08x%s%s%04x.bin",
         |                                  ^~~~~~
         |                                  |
         |                                  char **
   In file included from include/linux/list.h:9,
                    from include/linux/dmi.h:5,
                    from drivers/bluetooth/btusb.c:9:
   include/linux/kernel.h:204:20: note: expected 'char *' but argument is of type 'char **'
     204 | int snprintf(char *buf, size_t size, const char *fmt, ...);
         |              ~~~~~~^~~
   drivers/bluetooth/btusb.c:3354:40: warning: argument to 'sizeof' in 'snprintf' call is the same expression as the destination; did you mean to provide an explicit length? [-Wsizeof-pointer-memaccess]
    3354 |                 snprintf(fwname, sizeof(fwname), "qca/nvm_usb_%08x.bin",
         |                                        ^
   drivers/bluetooth/btusb.c:3354:26: error: passing argument 1 of 'snprintf' from incompatible pointer type [-Werror=incompatible-pointer-types]
    3354 |                 snprintf(fwname, sizeof(fwname), "qca/nvm_usb_%08x.bin",
         |                          ^~~~~~
         |                          |
         |                          char **
   In file included from include/linux/list.h:9,
                    from include/linux/dmi.h:5,
                    from drivers/bluetooth/btusb.c:9:
   include/linux/kernel.h:204:20: note: expected 'char *' but argument is of type 'char **'
     204 | int snprintf(char *buf, size_t size, const char *fmt, ...);
         |              ~~~~~~^~~
   drivers/bluetooth/btusb.c: In function 'btusb_setup_qca_load_nvm':
   drivers/bluetooth/btusb.c:3371:53: error: passing argument 1 of 'btusb_generate_qca_nvm_name' from incompatible pointer type [-Werror=incompatible-pointer-types]
    3371 |                         btusb_generate_qca_nvm_name(&fwname, sizeof(fwname), ver, "_", "gf");
         |                                                     ^~~~~~~
         |                                                     |
         |                                                     char (*)[64]
   drivers/bluetooth/btusb.c:3333:48: note: expected 'char **' but argument is of type 'char (*)[64]'
    3333 | static void btusb_generate_qca_nvm_name(char **fwname,
         |                                         ~~~~~~~^~~~~~
   drivers/bluetooth/btusb.c:3374:53: error: passing argument 1 of 'btusb_generate_qca_nvm_name' from incompatible pointer type [-Werror=incompatible-pointer-types]
    3374 |                         btusb_generate_qca_nvm_name(&fwname, sizeof(fwname), ver, NULL, NULL);
         |                                                     ^~~~~~~
         |                                                     |
         |                                                     char (*)[64]
   drivers/bluetooth/btusb.c:3333:48: note: expected 'char **' but argument is of type 'char (*)[64]'
    3333 | static void btusb_generate_qca_nvm_name(char **fwname,
         |                                         ~~~~~~~^~~~~~
   cc1: some warnings being treated as errors


vim +3342 drivers/bluetooth/btusb.c

  3332	
  3333	static void btusb_generate_qca_nvm_name(char **fwname,
  3334						int max_size,
  3335						struct qca_version *ver,
  3336						char *separator,
  3337						char *vendor)
  3338	{
  3339		if (((ver->flag >> 8) & 0xff) == QCA_FLAG_MULTI_NVM) {
  3340			/* if boardid equal 0, use default nvm without surfix */
  3341			if (le16_to_cpu(ver->board_id) == 0x0) {
> 3342				snprintf(fwname, sizeof(fwname), "qca/nvm_usb_%08x%s%s.bin",
  3343					 le32_to_cpu(ver->rom_version),
  3344					 separator,
  3345					 vendor);
  3346			} else {
  3347				snprintf(fwname, sizeof(fwname), "qca/nvm_usb_%08x%s%s%04x.bin",
  3348					le32_to_cpu(ver->rom_version),
  3349					separator,
  3350					vendor,
  3351					le16_to_cpu(ver->board_id));
  3352			}
  3353		} else {
  3354			snprintf(fwname, sizeof(fwname), "qca/nvm_usb_%08x.bin",
  3355				 le32_to_cpu(ver->rom_version));
  3356		}
  3357	

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
kernel test robot Aug. 23, 2021, 3:25 p.m. UTC | #3
Hi Zijun,

Thank you for the patch! Yet something to improve:

[auto build test ERROR on bluetooth-next/master]
[also build test ERROR on linus/master v5.14-rc7 next-20210823]
[cannot apply to linux/master bluetooth/master]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url:    https://github.com/0day-ci/linux/commits/Zijun-Hu/Bluetooth-btusb-Add-support-using-different-nvm-for-variant-WCN6855-controller/20210823-170111
base:   https://git.kernel.org/pub/scm/linux/kernel/git/bluetooth/bluetooth-next.git master
config: arc-allyesconfig (attached as .config)
compiler: arceb-elf-gcc (GCC) 11.2.0
reproduce (this is a W=1 build):
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # https://github.com/0day-ci/linux/commit/0e2a1544bcc7d3ffac1bd4c27614c8d892933ed3
        git remote add linux-review https://github.com/0day-ci/linux
        git fetch --no-tags linux-review Zijun-Hu/Bluetooth-btusb-Add-support-using-different-nvm-for-variant-WCN6855-controller/20210823-170111
        git checkout 0e2a1544bcc7d3ffac1bd4c27614c8d892933ed3
        # save the attached .config to linux build tree
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-11.2.0 make.cross ARCH=arc 

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>

All errors (new ones prefixed by >>):

   drivers/bluetooth/btusb.c: In function 'btusb_generate_qca_nvm_name':
>> drivers/bluetooth/btusb.c:3342:34: error: passing argument 1 of 'snprintf' from incompatible pointer type [-Werror=incompatible-pointer-types]
    3342 |                         snprintf(fwname, sizeof(fwname), "qca/nvm_usb_%08x%s%s.bin",
         |                                  ^~~~~~
         |                                  |
         |                                  char **
   In file included from include/linux/list.h:9,
                    from include/linux/dmi.h:5,
                    from drivers/bluetooth/btusb.c:9:
   include/linux/kernel.h:204:20: note: expected 'char *' but argument is of type 'char **'
     204 | int snprintf(char *buf, size_t size, const char *fmt, ...);
         |              ~~~~~~^~~
   drivers/bluetooth/btusb.c:3347:34: error: passing argument 1 of 'snprintf' from incompatible pointer type [-Werror=incompatible-pointer-types]
    3347 |                         snprintf(fwname, sizeof(fwname), "qca/nvm_usb_%08x%s%s%04x.bin",
         |                                  ^~~~~~
         |                                  |
         |                                  char **
   In file included from include/linux/list.h:9,
                    from include/linux/dmi.h:5,
                    from drivers/bluetooth/btusb.c:9:
   include/linux/kernel.h:204:20: note: expected 'char *' but argument is of type 'char **'
     204 | int snprintf(char *buf, size_t size, const char *fmt, ...);
         |              ~~~~~~^~~
   drivers/bluetooth/btusb.c:3354:26: error: passing argument 1 of 'snprintf' from incompatible pointer type [-Werror=incompatible-pointer-types]
    3354 |                 snprintf(fwname, sizeof(fwname), "qca/nvm_usb_%08x.bin",
         |                          ^~~~~~
         |                          |
         |                          char **
   In file included from include/linux/list.h:9,
                    from include/linux/dmi.h:5,
                    from drivers/bluetooth/btusb.c:9:
   include/linux/kernel.h:204:20: note: expected 'char *' but argument is of type 'char **'
     204 | int snprintf(char *buf, size_t size, const char *fmt, ...);
         |              ~~~~~~^~~
   drivers/bluetooth/btusb.c: In function 'btusb_setup_qca_load_nvm':
>> drivers/bluetooth/btusb.c:3371:53: error: passing argument 1 of 'btusb_generate_qca_nvm_name' from incompatible pointer type [-Werror=incompatible-pointer-types]
    3371 |                         btusb_generate_qca_nvm_name(&fwname, sizeof(fwname), ver, "_", "gf");
         |                                                     ^~~~~~~
         |                                                     |
         |                                                     char (*)[64]
   drivers/bluetooth/btusb.c:3333:48: note: expected 'char **' but argument is of type 'char (*)[64]'
    3333 | static void btusb_generate_qca_nvm_name(char **fwname,
         |                                         ~~~~~~~^~~~~~
   drivers/bluetooth/btusb.c:3374:53: error: passing argument 1 of 'btusb_generate_qca_nvm_name' from incompatible pointer type [-Werror=incompatible-pointer-types]
    3374 |                         btusb_generate_qca_nvm_name(&fwname, sizeof(fwname), ver, NULL, NULL);
         |                                                     ^~~~~~~
         |                                                     |
         |                                                     char (*)[64]
   drivers/bluetooth/btusb.c:3333:48: note: expected 'char **' but argument is of type 'char (*)[64]'
    3333 | static void btusb_generate_qca_nvm_name(char **fwname,
         |                                         ~~~~~~~^~~~~~
   cc1: some warnings being treated as errors


vim +/snprintf +3342 drivers/bluetooth/btusb.c

  3332	
  3333	static void btusb_generate_qca_nvm_name(char **fwname,
  3334						int max_size,
  3335						struct qca_version *ver,
  3336						char *separator,
  3337						char *vendor)
  3338	{
  3339		if (((ver->flag >> 8) & 0xff) == QCA_FLAG_MULTI_NVM) {
  3340			/* if boardid equal 0, use default nvm without surfix */
  3341			if (le16_to_cpu(ver->board_id) == 0x0) {
> 3342				snprintf(fwname, sizeof(fwname), "qca/nvm_usb_%08x%s%s.bin",
  3343					 le32_to_cpu(ver->rom_version),
  3344					 separator,
  3345					 vendor);
  3346			} else {
  3347				snprintf(fwname, sizeof(fwname), "qca/nvm_usb_%08x%s%s%04x.bin",
  3348					le32_to_cpu(ver->rom_version),
  3349					separator,
  3350					vendor,
  3351					le16_to_cpu(ver->board_id));
  3352			}
  3353		} else {
  3354			snprintf(fwname, sizeof(fwname), "qca/nvm_usb_%08x.bin",
  3355				 le32_to_cpu(ver->rom_version));
  3356		}
  3357	
  3358	}
  3359	
  3360	static int btusb_setup_qca_load_nvm(struct hci_dev *hdev,
  3361					    struct qca_version *ver,
  3362					    const struct qca_device_info *info)
  3363	{
  3364		const struct firmware *fw;
  3365		char fwname[64];
  3366		int err;
  3367	
  3368		switch (ver->ram_version) {
  3369		case WCN6855_2_0_RAM_VERSION_GF:
  3370		case WCN6855_2_1_RAM_VERSION_GF:
> 3371				btusb_generate_qca_nvm_name(&fwname, sizeof(fwname), ver, "_", "gf");
  3372			break;
  3373		default:
  3374				btusb_generate_qca_nvm_name(&fwname, sizeof(fwname), ver, NULL, NULL);
  3375			break;
  3376		}
  3377	
  3378		err = request_firmware(&fw, fwname, &hdev->dev);
  3379		if (err) {
  3380			bt_dev_err(hdev, "failed to request NVM file: %s (%d)",
  3381				   fwname, err);
  3382			return err;
  3383		}
  3384	
  3385		bt_dev_info(hdev, "using NVM file: %s", fwname);
  3386	
  3387		err = btusb_setup_qca_download_fw(hdev, fw, info->nvm_hdr);
  3388	
  3389		release_firmware(fw);
  3390	
  3391		return err;
  3392	}
  3393	

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
Matthias Kaehlcke Aug. 23, 2021, 5:43 p.m. UTC | #4
On Mon, Aug 23, 2021 at 04:58:20PM +0800, Zijun Hu wrote:
> From: Tim Jiang <tjiang@codeaurora.org>
> 
> we have variant wcn6855 soc chip from different vendors, so we should
> use different nvm file with suffix to distinguish them.

I think the concept of 'vendor' (or 'factory' as it was named earlier) needs
more clarification.

Are we talking about USB BT modules with a the wcn6855 that are marketed by
the 'vendor'? If so, could the USB vendor it be used to determine the vendor?
Could modules from different vendors use the same firmware, even though it's
not the same for all vendors?.

> Signed-off-by: Tim Jiang <tjiang@codeaurora.org>

Please also add your own Signed-off-by tag, even when sending unmodified
patches on behalf of others. In this case you are making changes to the
original patch and are effectively a co-author, which is another important
reason for adding the tag.

> ---
>  drivers/bluetooth/btusb.c | 46 ++++++++++++++++++++++++++++++++++++----------
>  1 file changed, 36 insertions(+), 10 deletions(-)
> 
> diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c
> index 60d2fce59a71..9b4408307138 100644
> --- a/drivers/bluetooth/btusb.c
> +++ b/drivers/bluetooth/btusb.c
> @@ -3141,6 +3141,9 @@ static int btusb_set_bdaddr_wcn6855(struct hci_dev *hdev,
>  #define QCA_DFU_TIMEOUT		3000
>  #define QCA_FLAG_MULTI_NVM      0x80
>  
> +#define WCN6855_2_0_RAM_VERSION_GF 0x400c1200
> +#define WCN6855_2_1_RAM_VERSION_GF 0x400c1211
> +
>  struct qca_version {
>  	__le32	rom_version;
>  	__le32	patch_version;
> @@ -3172,6 +3175,7 @@ static const struct qca_device_info qca_devices_table[] = {
>  	{ 0x00000302, 28, 4, 16 }, /* Rome 3.2 */
>  	{ 0x00130100, 40, 4, 16 }, /* WCN6855 1.0 */
>  	{ 0x00130200, 40, 4, 16 }, /* WCN6855 2.0 */
> +	{ 0x00130201, 40, 4, 16 }, /* WCN6855 2.1 */
>  };
>  
>  static int btusb_qca_send_vendor_req(struct usb_device *udev, u8 request,
> @@ -3326,22 +3330,24 @@ static int btusb_setup_qca_load_rampatch(struct hci_dev *hdev,
>  	return err;
>  }
>  
> -static int btusb_setup_qca_load_nvm(struct hci_dev *hdev,
> -				    struct qca_version *ver,
> -				    const struct qca_device_info *info)
> +static void btusb_generate_qca_nvm_name(char **fwname,
> +					int max_size,
> +					struct qca_version *ver,
> +					char *separator,

'separator' is part of the internal logic of this function, the caller
shouldn't have to care about it. Define it as a local variable instead
and initialize it to ''. If 'vendor' (or whatever it is called) is not
NULL assign 'separator' to '_'.

> +					char *vendor)
>  {
> -	const struct firmware *fw;
> -	char fwname[64];
> -	int err;
> -

	u16 board_id = le16_to_cpu(ver->board_id);
	u32 rom_version = le32_to_cpu(ver->rom_version));

Then use these local variable instead of doing the endianness conversion
over and over again.

>  	if (((ver->flag >> 8) & 0xff) == QCA_FLAG_MULTI_NVM) {
>  		/* if boardid equal 0, use default nvm without surfix */
>  		if (le16_to_cpu(ver->board_id) == 0x0) {
> -			snprintf(fwname, sizeof(fwname), "qca/nvm_usb_%08x.bin",
> -				 le32_to_cpu(ver->rom_version));
> +			snprintf(fwname, sizeof(fwname), "qca/nvm_usb_%08x%s%s.bin",
> +				 le32_to_cpu(ver->rom_version),
> +				 separator,
> +				 vendor);
>  		} else {
> -			snprintf(fwname, sizeof(fwname), "qca/nvm_usb_%08x_%04x.bin",
> +			snprintf(fwname, sizeof(fwname), "qca/nvm_usb_%08x%s%s%04x.bin",
>  				le32_to_cpu(ver->rom_version),
> +				separator,
> +				vendor,
>  				le16_to_cpu(ver->board_id));
>  		}
>  	} else {
> @@ -3349,6 +3355,26 @@ static int btusb_setup_qca_load_nvm(struct hci_dev *hdev,
>  			 le32_to_cpu(ver->rom_version));
>  	}
>  
> +}
> +
> +static int btusb_setup_qca_load_nvm(struct hci_dev *hdev,
> +				    struct qca_version *ver,
> +				    const struct qca_device_info *info)
> +{
> +	const struct firmware *fw;
> +	char fwname[64];
> +	int err;
> +
> +	switch (ver->ram_version) {
> +	case WCN6855_2_0_RAM_VERSION_GF:
> +	case WCN6855_2_1_RAM_VERSION_GF:
> +			btusb_generate_qca_nvm_name(&fwname, sizeof(fwname), ver, "_", "gf");
> +		break;
> +	default:
> +			btusb_generate_qca_nvm_name(&fwname, sizeof(fwname), ver, NULL, NULL);
> +		break;
> +	}
> +
>  	err = request_firmware(&fw, fwname, &hdev->dev);
>  	if (err) {
>  		bt_dev_err(hdev, "failed to request NVM file: %s (%d)",
> -- 
> The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum, a Linux Foundation Collaborative Project
>
diff mbox series

Patch

diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c
index 60d2fce59a71..9b4408307138 100644
--- a/drivers/bluetooth/btusb.c
+++ b/drivers/bluetooth/btusb.c
@@ -3141,6 +3141,9 @@  static int btusb_set_bdaddr_wcn6855(struct hci_dev *hdev,
 #define QCA_DFU_TIMEOUT		3000
 #define QCA_FLAG_MULTI_NVM      0x80
 
+#define WCN6855_2_0_RAM_VERSION_GF 0x400c1200
+#define WCN6855_2_1_RAM_VERSION_GF 0x400c1211
+
 struct qca_version {
 	__le32	rom_version;
 	__le32	patch_version;
@@ -3172,6 +3175,7 @@  static const struct qca_device_info qca_devices_table[] = {
 	{ 0x00000302, 28, 4, 16 }, /* Rome 3.2 */
 	{ 0x00130100, 40, 4, 16 }, /* WCN6855 1.0 */
 	{ 0x00130200, 40, 4, 16 }, /* WCN6855 2.0 */
+	{ 0x00130201, 40, 4, 16 }, /* WCN6855 2.1 */
 };
 
 static int btusb_qca_send_vendor_req(struct usb_device *udev, u8 request,
@@ -3326,22 +3330,24 @@  static int btusb_setup_qca_load_rampatch(struct hci_dev *hdev,
 	return err;
 }
 
-static int btusb_setup_qca_load_nvm(struct hci_dev *hdev,
-				    struct qca_version *ver,
-				    const struct qca_device_info *info)
+static void btusb_generate_qca_nvm_name(char **fwname,
+					int max_size,
+					struct qca_version *ver,
+					char *separator,
+					char *vendor)
 {
-	const struct firmware *fw;
-	char fwname[64];
-	int err;
-
 	if (((ver->flag >> 8) & 0xff) == QCA_FLAG_MULTI_NVM) {
 		/* if boardid equal 0, use default nvm without surfix */
 		if (le16_to_cpu(ver->board_id) == 0x0) {
-			snprintf(fwname, sizeof(fwname), "qca/nvm_usb_%08x.bin",
-				 le32_to_cpu(ver->rom_version));
+			snprintf(fwname, sizeof(fwname), "qca/nvm_usb_%08x%s%s.bin",
+				 le32_to_cpu(ver->rom_version),
+				 separator,
+				 vendor);
 		} else {
-			snprintf(fwname, sizeof(fwname), "qca/nvm_usb_%08x_%04x.bin",
+			snprintf(fwname, sizeof(fwname), "qca/nvm_usb_%08x%s%s%04x.bin",
 				le32_to_cpu(ver->rom_version),
+				separator,
+				vendor,
 				le16_to_cpu(ver->board_id));
 		}
 	} else {
@@ -3349,6 +3355,26 @@  static int btusb_setup_qca_load_nvm(struct hci_dev *hdev,
 			 le32_to_cpu(ver->rom_version));
 	}
 
+}
+
+static int btusb_setup_qca_load_nvm(struct hci_dev *hdev,
+				    struct qca_version *ver,
+				    const struct qca_device_info *info)
+{
+	const struct firmware *fw;
+	char fwname[64];
+	int err;
+
+	switch (ver->ram_version) {
+	case WCN6855_2_0_RAM_VERSION_GF:
+	case WCN6855_2_1_RAM_VERSION_GF:
+			btusb_generate_qca_nvm_name(&fwname, sizeof(fwname), ver, "_", "gf");
+		break;
+	default:
+			btusb_generate_qca_nvm_name(&fwname, sizeof(fwname), ver, NULL, NULL);
+		break;
+	}
+
 	err = request_firmware(&fw, fwname, &hdev->dev);
 	if (err) {
 		bt_dev_err(hdev, "failed to request NVM file: %s (%d)",