aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStefan Schmidt <stefan@osg.samsung.com>2017-01-02 10:58:13 -0500
committerMarcel Holtmann <marcel@holtmann.org>2017-01-12 16:12:43 -0500
commit8e38b7d4d71479b23b77f01cf0e5071610b8f357 (patch)
tree834d6d36df7c907c4edd68ef04962f42b98164da
parentf301606934b240fb54d8edf3618a0483e36046fc (diff)
ieee802154: atusb: fix driver to work with older firmware versions
After the addition of the frame_retries callback we could run into cases where a ATUSB device with an older firmware version would now longer be able to bring the interface up. We keep this functionality disabled now if the minimum firmware version for this feature is not available. Fixes: 5d82288b93db3bc ("ieee802154: atusb: implement .set_frame_retries ops callback") Reported-by: Alexander Aring <aar@pengutronix.de> Acked-by: Alexander Aring <aar@pengutronix.de> Signed-off-by: Stefan Schmidt <stefan@osg.samsung.com> Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
-rw-r--r--drivers/net/ieee802154/atusb.c13
1 files changed, 4 insertions, 9 deletions
diff --git a/drivers/net/ieee802154/atusb.c b/drivers/net/ieee802154/atusb.c
index 63cb67917a07..ef688518ad77 100644
--- a/drivers/net/ieee802154/atusb.c
+++ b/drivers/net/ieee802154/atusb.c
@@ -562,13 +562,6 @@ static int
562atusb_set_frame_retries(struct ieee802154_hw *hw, s8 retries) 562atusb_set_frame_retries(struct ieee802154_hw *hw, s8 retries)
563{ 563{
564 struct atusb *atusb = hw->priv; 564 struct atusb *atusb = hw->priv;
565 struct device *dev = &atusb->usb_dev->dev;
566
567 if (atusb->fw_ver_maj == 0 && atusb->fw_ver_min < 3) {
568 dev_info(dev, "Automatic frame retransmission is only available from "
569 "firmware version 0.3. Please update if you want this feature.");
570 return -EINVAL;
571 }
572 565
573 return atusb_write_subreg(atusb, SR_MAX_FRAME_RETRIES, retries); 566 return atusb_write_subreg(atusb, SR_MAX_FRAME_RETRIES, retries);
574} 567}
@@ -802,8 +795,7 @@ static int atusb_probe(struct usb_interface *interface,
802 795
803 hw->parent = &usb_dev->dev; 796 hw->parent = &usb_dev->dev;
804 hw->flags = IEEE802154_HW_TX_OMIT_CKSUM | IEEE802154_HW_AFILT | 797 hw->flags = IEEE802154_HW_TX_OMIT_CKSUM | IEEE802154_HW_AFILT |
805 IEEE802154_HW_PROMISCUOUS | IEEE802154_HW_CSMA_PARAMS | 798 IEEE802154_HW_PROMISCUOUS | IEEE802154_HW_CSMA_PARAMS;
806 IEEE802154_HW_FRAME_RETRIES;
807 799
808 hw->phy->flags = WPAN_PHY_FLAG_TXPOWER | WPAN_PHY_FLAG_CCA_ED_LEVEL | 800 hw->phy->flags = WPAN_PHY_FLAG_TXPOWER | WPAN_PHY_FLAG_CCA_ED_LEVEL |
809 WPAN_PHY_FLAG_CCA_MODE; 801 WPAN_PHY_FLAG_CCA_MODE;
@@ -832,6 +824,9 @@ static int atusb_probe(struct usb_interface *interface,
832 atusb_get_and_show_build(atusb); 824 atusb_get_and_show_build(atusb);
833 atusb_set_extended_addr(atusb); 825 atusb_set_extended_addr(atusb);
834 826
827 if (atusb->fw_ver_maj >= 0 && atusb->fw_ver_min >= 3)
828 hw->flags |= IEEE802154_HW_FRAME_RETRIES;
829
835 ret = atusb_get_and_clear_error(atusb); 830 ret = atusb_get_and_clear_error(atusb);
836 if (ret) { 831 if (ret) {
837 dev_err(&atusb->usb_dev->dev, 832 dev_err(&atusb->usb_dev->dev,