/** * wq_netinfo - work queue function * @wq_obj: object that holds data for our deferred work to do * * This retrieves the network interface status of the USB INIC * and compares it with the current status. If the status has * changed, it updates the status of the core. */ static void wq_netinfo(struct work_struct *wq_obj) { struct most_dev *mdev = to_mdev_from_work(wq_obj); int i, prev_link_stat = mdev->link_stat; u8 prev_hw_addr[6]; for (i = 0; i < 6; i++) prev_hw_addr[i] = mdev->hw_addr[i]; if (hdm_update_netinfo(mdev) < 0) return; if (prev_link_stat != mdev->link_stat || prev_hw_addr[0] != mdev->hw_addr[0] || prev_hw_addr[1] != mdev->hw_addr[1] || prev_hw_addr[2] != mdev->hw_addr[2] || prev_hw_addr[3] != mdev->hw_addr[3] || prev_hw_addr[4] != mdev->hw_addr[4] || prev_hw_addr[5] != mdev->hw_addr[5]) most_deliver_netinfo(&mdev->iface, mdev->link_stat, &mdev->hw_addr[0]); }
/** * wq_netinfo - work queue function to deliver latest networking information * @wq_obj: object that holds data for our deferred work to do * * This retrieves the network interface status of the USB INIC */ static void wq_netinfo(struct work_struct *wq_obj) { struct most_dev *mdev = to_mdev_from_work(wq_obj); struct usb_device *usb_device = mdev->usb_device; struct device *dev = &usb_device->dev; u16 hi, mi, lo, link; u8 hw_addr[6]; if (drci_rd_reg(usb_device, DRCI_REG_HW_ADDR_HI, &hi) < 0) { dev_err(dev, "Vendor request 'hw_addr_hi' failed\n"); return; } if (drci_rd_reg(usb_device, DRCI_REG_HW_ADDR_MI, &mi) < 0) { dev_err(dev, "Vendor request 'hw_addr_mid' failed\n"); return; } if (drci_rd_reg(usb_device, DRCI_REG_HW_ADDR_LO, &lo) < 0) { dev_err(dev, "Vendor request 'hw_addr_low' failed\n"); return; } if (drci_rd_reg(usb_device, DRCI_REG_NI_STATE, &link) < 0) { dev_err(dev, "Vendor request 'link status' failed\n"); return; } hw_addr[0] = hi >> 8; hw_addr[1] = hi; hw_addr[2] = mi >> 8; hw_addr[3] = mi; hw_addr[4] = lo >> 8; hw_addr[5] = lo; if (mdev->on_netinfo) mdev->on_netinfo(&mdev->iface, link, hw_addr); }