ieee802154: atusb: try to read permanent extended address from device
Hello Stefan Schmidt,
The patch 6cc33eba232c: "ieee802154: atusb: try to read permanent extended address from device" from Dec 5, 2016, leads to the following static checker warning:
drivers/net/ieee802154/atusb.c:714 atusb_set_extended_addr() error: doing dma on the stack (buffer)
drivers/net/ieee802154/atusb.c
698 static int atusb_set_extended_addr(struct atusb *atusb) 699 {
700 struct usb_device *usb_dev = atusb->usb_dev;
701 unsigned char buffer[IEEE802154_EXTENDED_ADDR_LEN];
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
702 __le64 extended_addr;
703 u64 addr;
704 int ret;
705
706 /* Firmware versions before 0.3 do not support the EUI64_READ command.
707 * Just use a random address and be done */
708 if (atusb->fw_ver_maj == 0 && atusb->fw_ver_min < 3) {
709 ieee802154_random_extended_addr(&atusb->hw->phy->perm_extended_addr);
710 return 0;
711 }
712
713 /* Firmware is new enough so we fetch the address from EEPROM */
714 ret = atusb_control_msg(atusb, usb_rcvctrlpipe(usb_dev, 0),
715 ATUSB_EUI64_READ, ATUSB_REQ_FROM_DEV, 0, 0,
716 buffer, IEEE802154_EXTENDED_ADDR_LEN, 1000);
^^^^^^Stack memory is not dma-able and this is especially important for 4.9 and later kernels because of the virtually mapped stacks I believe?
717 if (ret < 0)
718 dev_err(&usb_dev->dev, "failed to fetch extended address\n");
719
720 memcpy(&extended_addr, buffer, IEEE802154_EXTENDED_ADDR_LEN);
721 /* Check if read address is not empty and the unicast bit is set correctly */
722 if (!ieee802154_is_valid_extended_unicast_addr(extended_addr)) {
723 dev_info(&usb_dev->dev, "no permanent extended address found, random address set\n");
724 ieee802154_random_extended_addr(&atusb->hw->phy->perm_extended_addr);
725 } else {
726 atusb->hw->phy->perm_extended_addr = extended_addr;
727 addr = swab64((__force u64)atusb->hw->phy->perm_extended_addr);
728 dev_info(&usb_dev->dev, "Read permanent extended address %8phC from device\n",
729 &addr);
730 }
731
732 return ret;
733 }See these older warnings as well:
drivers/net/ieee802154/atusb.c:123 atusb_read_reg() error: doing dma on the stack (&value) drivers/net/ieee802154/atusb.c:126 atusb_read_reg() error: uninitialized symbol 'value'. drivers/net/ieee802154/atusb.c:615 atusb_get_and_show_revision() error: doing dma on the stack (buffer) drivers/net/ieee802154/atusb.c:643 atusb_get_and_show_build() error: doing dma on the stack (build)
regards,
dan carpenter
Hello.
Quoted 53 lines · Dan Carpenter
Hello Stefan Schmidt,
The patch
6cc33eba232c: "ieee802154: atusb: try to read permanent extended address from device" from Dec 5, 2016, leads to the following static checker warning:drivers/net/ieee802154/atusb.c:714 atusb_set_extended_addr() error: doing dma on the stack (buffer)
drivers/net/ieee802154/atusb.c
698 static intatusb_set_extended_addr(struct atusb *atusb)699 { 700 struct usb_device *usb_dev = atusb->usb_dev; 701 unsigned char buffer[IEEE802154_EXTENDED_ADDR_LEN]; ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 702 __le64 extended_addr; 703 u64 addr; 704 int ret; 705 706 /* Firmware versions before 0.3 do not support the EUI64_READ command. 707 * Just use a random address and be done */ 708 if (atusb->fw_ver_maj == 0 && atusb->fw_ver_min < 3) { 709 ieee802154_random_extended_addr(&atusb->hw->phy->perm_extended_addr); 710 return 0; 711 } 712 713 /* Firmware is new enough so we fetch the address from EEPROM */ 714 ret = atusb_control_msg(atusb, usb_rcvctrlpipe(usb_dev, 0), 715 ATUSB_EUI64_READ, ATUSB_REQ_FROM_DEV, 0, 0, 716 buffer, IEEE802154_EXTENDED_ADDR_LEN, 1000); ^^^^^^Stack memory is not dma-able and this is especially important for 4.9 and later kernels because of the virtually mapped stacks I believe?
717 if (ret < 0) 718 dev_err(&usb_dev->dev, "failed to fetch extended address\n"); 719 720 memcpy(&extended_addr, buffer, IEEE802154_EXTENDED_ADDR_LEN); 721 /* Check if read address is not empty and the unicast bit is set correctly */ 722 if (!ieee802154_is_valid_extended_unicast_addr(extended_addr)) { 723 dev_info(&usb_dev->dev, "no permanent extended address found, random address set\n"); 724 ieee802154_random_extended_addr(&atusb->hw->phy->perm_extended_addr); 725 } else { 726 atusb->hw->phy->perm_extended_addr = extended_addr; 727 addr = swab64((__force u64)atusb->hw->phy->perm_extended_addr); 728 dev_info(&usb_dev->dev, "Read permanent extended address %8phC from device\n", 729 &addr); 730 } 731 732 return ret; 733 }
Quoted 6 lines
See these older warnings as well:
drivers/net/ieee802154/atusb.c:123atusb_read_reg()error: doing dma on the stack (&value)drivers/net/ieee802154/atusb.c:126atusb_read_reg()error: uninitialized symbol 'value'.drivers/net/ieee802154/atusb.c:615atusb_get_and_show_revision()error: doing dma on the stack (buffer)drivers/net/ieee802154/atusb.c:643atusb_get_and_show_build()error: doing dma on the stack (build)
Thanks for pointing them out. I will cook up a patch and test it today.
regards
Stefan Schmidt
Hello.
Quoted 53 lines · Dan Carpenter
Hello Stefan Schmidt,
The patch
6cc33eba232c: "ieee802154: atusb: try to read permanent extended address from device" from Dec 5, 2016, leads to the following static checker warning:drivers/net/ieee802154/atusb.c:714 atusb_set_extended_addr() error: doing dma on the stack (buffer)
drivers/net/ieee802154/atusb.c
698 static intatusb_set_extended_addr(struct atusb *atusb)699 { 700 struct usb_device *usb_dev = atusb->usb_dev; 701 unsigned char buffer[IEEE802154_EXTENDED_ADDR_LEN]; ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 702 __le64 extended_addr; 703 u64 addr; 704 int ret; 705 706 /* Firmware versions before 0.3 do not support the EUI64_READ command. 707 * Just use a random address and be done */ 708 if (atusb->fw_ver_maj == 0 && atusb->fw_ver_min < 3) { 709 ieee802154_random_extended_addr(&atusb->hw->phy->perm_extended_addr); 710 return 0; 711 } 712 713 /* Firmware is new enough so we fetch the address from EEPROM */ 714 ret = atusb_control_msg(atusb, usb_rcvctrlpipe(usb_dev, 0), 715 ATUSB_EUI64_READ, ATUSB_REQ_FROM_DEV, 0, 0, 716 buffer, IEEE802154_EXTENDED_ADDR_LEN, 1000); ^^^^^^Stack memory is not dma-able and this is especially important for 4.9 and later kernels because of the virtually mapped stacks I believe?
717 if (ret < 0) 718 dev_err(&usb_dev->dev, "failed to fetch extended address\n"); 719 720 memcpy(&extended_addr, buffer, IEEE802154_EXTENDED_ADDR_LEN); 721 /* Check if read address is not empty and the unicast bit is set correctly */ 722 if (!ieee802154_is_valid_extended_unicast_addr(extended_addr)) { 723 dev_info(&usb_dev->dev, "no permanent extended address found, random address set\n"); 724 ieee802154_random_extended_addr(&atusb->hw->phy->perm_extended_addr); 725 } else { 726 atusb->hw->phy->perm_extended_addr = extended_addr; 727 addr = swab64((__force u64)atusb->hw->phy->perm_extended_addr); 728 dev_info(&usb_dev->dev, "Read permanent extended address %8phC from device\n", 729 &addr); 730 } 731 732 return ret; 733 }
Quoted 7 lines
See these older warnings as well:
drivers/net/ieee802154/atusb.c:123atusb_read_reg()error: doing dma on the stack (&value)drivers/net/ieee802154/atusb.c:126atusb_read_reg()error: uninitialized symbol 'value'.drivers/net/ieee802154/atusb.c:615atusb_get_and_show_revision()error: doing dma on the stack (buffer)drivers/net/ieee802154/atusb.c:643atusb_get_and_show_build()error: doing dma on the stack (build)
Just sent a patchset fixing those. Thanks for letting us know.
regards
Stefan Schmidt