@@ -117,13 +117,26 @@ static int atusb_read_reg(struct atusb *atusb, uint8_t reg)
117
117
{
118
118
struct usb_device * usb_dev = atusb -> usb_dev ;
119
119
int ret ;
120
+ uint8_t * buffer ;
120
121
uint8_t value ;
121
122
123
+ buffer = kmalloc (1 , GFP_KERNEL );
124
+ if (!buffer )
125
+ return - ENOMEM ;
126
+
122
127
dev_dbg (& usb_dev -> dev , "atusb: reg = 0x%x\n" , reg );
123
128
ret = atusb_control_msg (atusb , usb_rcvctrlpipe (usb_dev , 0 ),
124
129
ATUSB_REG_READ , ATUSB_REQ_FROM_DEV ,
125
- 0 , reg , & value , 1 , 1000 );
126
- return ret >= 0 ? value : ret ;
130
+ 0 , reg , buffer , 1 , 1000 );
131
+
132
+ if (ret >= 0 ) {
133
+ value = buffer [0 ];
134
+ kfree (buffer );
135
+ return value ;
136
+ } else {
137
+ kfree (buffer );
138
+ return ret ;
139
+ }
127
140
}
128
141
129
142
static int atusb_write_subreg (struct atusb * atusb , uint8_t reg , uint8_t mask ,
@@ -549,13 +562,6 @@ static int
549
562
atusb_set_frame_retries (struct ieee802154_hw * hw , s8 retries )
550
563
{
551
564
struct atusb * atusb = hw -> priv ;
552
- struct device * dev = & atusb -> usb_dev -> dev ;
553
-
554
- if (atusb -> fw_ver_maj == 0 && atusb -> fw_ver_min < 3 ) {
555
- dev_info (dev , "Automatic frame retransmission is only available from "
556
- "firmware version 0.3. Please update if you want this feature." );
557
- return - EINVAL ;
558
- }
559
565
560
566
return atusb_write_subreg (atusb , SR_MAX_FRAME_RETRIES , retries );
561
567
}
@@ -608,9 +614,13 @@ static const struct ieee802154_ops atusb_ops = {
608
614
static int atusb_get_and_show_revision (struct atusb * atusb )
609
615
{
610
616
struct usb_device * usb_dev = atusb -> usb_dev ;
611
- unsigned char buffer [ 3 ] ;
617
+ unsigned char * buffer ;
612
618
int ret ;
613
619
620
+ buffer = kmalloc (3 , GFP_KERNEL );
621
+ if (!buffer )
622
+ return - ENOMEM ;
623
+
614
624
/* Get a couple of the ATMega Firmware values */
615
625
ret = atusb_control_msg (atusb , usb_rcvctrlpipe (usb_dev , 0 ),
616
626
ATUSB_ID , ATUSB_REQ_FROM_DEV , 0 , 0 ,
@@ -631,15 +641,20 @@ static int atusb_get_and_show_revision(struct atusb *atusb)
631
641
dev_info (& usb_dev -> dev , "Please update to version 0.2 or newer" );
632
642
}
633
643
644
+ kfree (buffer );
634
645
return ret ;
635
646
}
636
647
637
648
static int atusb_get_and_show_build (struct atusb * atusb )
638
649
{
639
650
struct usb_device * usb_dev = atusb -> usb_dev ;
640
- char build [ ATUSB_BUILD_SIZE + 1 ] ;
651
+ char * build ;
641
652
int ret ;
642
653
654
+ build = kmalloc (ATUSB_BUILD_SIZE + 1 , GFP_KERNEL );
655
+ if (!build )
656
+ return - ENOMEM ;
657
+
643
658
ret = atusb_control_msg (atusb , usb_rcvctrlpipe (usb_dev , 0 ),
644
659
ATUSB_BUILD , ATUSB_REQ_FROM_DEV , 0 , 0 ,
645
660
build , ATUSB_BUILD_SIZE , 1000 );
@@ -648,6 +663,7 @@ static int atusb_get_and_show_build(struct atusb *atusb)
648
663
dev_info (& usb_dev -> dev , "Firmware: build %s\n" , build );
649
664
}
650
665
666
+ kfree (build );
651
667
return ret ;
652
668
}
653
669
@@ -698,7 +714,7 @@ static int atusb_get_and_show_chip(struct atusb *atusb)
698
714
static int atusb_set_extended_addr (struct atusb * atusb )
699
715
{
700
716
struct usb_device * usb_dev = atusb -> usb_dev ;
701
- unsigned char buffer [ IEEE802154_EXTENDED_ADDR_LEN ] ;
717
+ unsigned char * buffer ;
702
718
__le64 extended_addr ;
703
719
u64 addr ;
704
720
int ret ;
@@ -710,12 +726,20 @@ static int atusb_set_extended_addr(struct atusb *atusb)
710
726
return 0 ;
711
727
}
712
728
729
+ buffer = kmalloc (IEEE802154_EXTENDED_ADDR_LEN , GFP_KERNEL );
730
+ if (!buffer )
731
+ return - ENOMEM ;
732
+
713
733
/* Firmware is new enough so we fetch the address from EEPROM */
714
734
ret = atusb_control_msg (atusb , usb_rcvctrlpipe (usb_dev , 0 ),
715
735
ATUSB_EUI64_READ , ATUSB_REQ_FROM_DEV , 0 , 0 ,
716
736
buffer , IEEE802154_EXTENDED_ADDR_LEN , 1000 );
717
- if (ret < 0 )
718
- dev_err (& usb_dev -> dev , "failed to fetch extended address\n" );
737
+ if (ret < 0 ) {
738
+ dev_err (& usb_dev -> dev , "failed to fetch extended address, random address set\n" );
739
+ ieee802154_random_extended_addr (& atusb -> hw -> phy -> perm_extended_addr );
740
+ kfree (buffer );
741
+ return ret ;
742
+ }
719
743
720
744
memcpy (& extended_addr , buffer , IEEE802154_EXTENDED_ADDR_LEN );
721
745
/* Check if read address is not empty and the unicast bit is set correctly */
@@ -729,6 +753,7 @@ static int atusb_set_extended_addr(struct atusb *atusb)
729
753
& addr );
730
754
}
731
755
756
+ kfree (buffer );
732
757
return ret ;
733
758
}
734
759
@@ -770,8 +795,7 @@ static int atusb_probe(struct usb_interface *interface,
770
795
771
796
hw -> parent = & usb_dev -> dev ;
772
797
hw -> flags = IEEE802154_HW_TX_OMIT_CKSUM | IEEE802154_HW_AFILT |
773
- IEEE802154_HW_PROMISCUOUS | IEEE802154_HW_CSMA_PARAMS |
774
- IEEE802154_HW_FRAME_RETRIES ;
798
+ IEEE802154_HW_PROMISCUOUS | IEEE802154_HW_CSMA_PARAMS ;
775
799
776
800
hw -> phy -> flags = WPAN_PHY_FLAG_TXPOWER | WPAN_PHY_FLAG_CCA_ED_LEVEL |
777
801
WPAN_PHY_FLAG_CCA_MODE ;
@@ -800,6 +824,9 @@ static int atusb_probe(struct usb_interface *interface,
800
824
atusb_get_and_show_build (atusb );
801
825
atusb_set_extended_addr (atusb );
802
826
827
+ if (atusb -> fw_ver_maj >= 0 && atusb -> fw_ver_min >= 3 )
828
+ hw -> flags |= IEEE802154_HW_FRAME_RETRIES ;
829
+
803
830
ret = atusb_get_and_clear_error (atusb );
804
831
if (ret ) {
805
832
dev_err (& atusb -> usb_dev -> dev ,
0 commit comments