25
25
#define WPANUSB_ALLOC_DELAY_MS 100 /* delay after failed allocation */
26
26
27
27
#define VENDOR_OUT (USB_TYPE_VENDOR | USB_DIR_OUT)
28
+ #define VENDOR_IN (USB_TYPE_VENDOR | USB_DIR_IN)
28
29
29
30
#define WPANUSB_VALID_CHANNELS (0x07FFFFFF)
30
31
@@ -56,6 +57,17 @@ static int wpanusb_control_send(struct wpanusb *wpanusb, unsigned int pipe,
56
57
0 , 0 , data , size , 1000 );
57
58
}
58
59
60
+ static int wpanusb_control_recv (struct wpanusb * wpanusb , u8 request , void * data , u16 size )
61
+ {
62
+ struct usb_device * udev = wpanusb -> udev ;
63
+
64
+ usb_control_msg (udev , usb_sndctrlpipe (udev , 0 ), request , VENDOR_OUT ,
65
+ 0 , 0 , NULL , 0 , 1000 );
66
+
67
+ return usb_control_msg (udev , usb_rcvbulkpipe (udev , 1 ), request , VENDOR_IN ,
68
+ 0 , 0 , data , size , 1000 );
69
+ }
70
+
59
71
/* ----- skb allocation ---------------------------------------------------- */
60
72
61
73
#define MAX_PSDU 127
@@ -448,6 +460,7 @@ static int wpanusb_get_device_capabilities(struct ieee802154_hw *hw)
448
460
struct wpanusb * wpanusb = hw -> priv ;
449
461
struct usb_device * udev = wpanusb -> udev ;
450
462
unsigned char * buffer ;
463
+ uint32_t valid_channels ;
451
464
int ret = 0 ;
452
465
453
466
buffer = kmalloc (IEEE802154_EXTENDED_ADDR_LEN , GFP_KERNEL );
@@ -463,18 +476,31 @@ static int wpanusb_get_device_capabilities(struct ieee802154_hw *hw)
463
476
return ret ;
464
477
}
465
478
479
+ buffer = kmalloc (sizeof (valid_channels ), GFP_NOIO );
480
+ if (!buffer )
481
+ return - ENOMEM ;
482
+ ret = wpanusb_control_recv (wpanusb , GET_SUPPORTED_CHANNELS , buffer , sizeof (valid_channels ));
483
+ if (ret != sizeof (uint32_t )) {
484
+ dev_err (& udev -> dev , "failed to fetch supported channels\n" );
485
+ kfree (buffer );
486
+ return ret ;
487
+ }
488
+ valid_channels = * (uint32_t * )buffer ;
489
+ if (!valid_channels ) {
490
+ dev_err (& udev -> dev , "failed to fetch valid channels, setting default valid channels\n" );
491
+ valid_channels = WPANUSB_VALID_CHANNELS ;
492
+ }
493
+
466
494
/* FIXME: these need to come from device capabilities */
467
- hw -> flags = IEEE802154_HW_TX_OMIT_CKSUM | IEEE802154_HW_AFILT |
468
- IEEE802154_HW_PROMISCUOUS ;
495
+ hw -> flags = IEEE802154_HW_TX_OMIT_CKSUM | IEEE802154_HW_AFILT ;
469
496
470
497
/* FIXME: these need to come from device capabilities */
471
498
hw -> phy -> flags = WPAN_PHY_FLAG_TXPOWER ;
472
499
473
500
/* Set default and supported channels */
474
501
hw -> phy -> current_page = 0 ;
475
- hw -> phy -> current_channel = 11 ;
476
- /* FIXME: these need to come from device capabilities */
477
- hw -> phy -> supported .channels [0 ] = WPANUSB_VALID_CHANNELS ;
502
+ hw -> phy -> current_channel = ffs (valid_channels ) - 1 ; //set to lowest valid channel
503
+ hw -> phy -> supported .channels [0 ] = valid_channels ;
478
504
479
505
/* FIXME: these need to come from device capabilities */
480
506
hw -> phy -> supported .tx_powers = wpanusb_powers ;
0 commit comments