diff --git a/drivers/usb/atm/cxacru.c b/drivers/usb/atm/cxacru.c index 636f7886fc260..501a51b27e466 100644 --- a/drivers/usb/atm/cxacru.c +++ b/drivers/usb/atm/cxacru.c @@ -356,7 +356,7 @@ static ssize_t adsl_state_store(struct device *dev, if (!strcmp(str_cmd, "stop") || !strcmp(str_cmd, "restart")) { ret = cxacru_cm(instance, CM_REQUEST_CHIP_ADSL_LINE_STOP, NULL, 0, NULL, 0); if (ret < 0) { - atm_err(instance->usbatm, "change adsl state:" + usb_err(instance->usbatm, "change adsl state:" " CHIP_ADSL_LINE_STOP returned %d\n", ret); ret = -EIO; @@ -376,7 +376,7 @@ static ssize_t adsl_state_store(struct device *dev, if (!strcmp(str_cmd, "start") || !strcmp(str_cmd, "restart")) { ret = cxacru_cm(instance, CM_REQUEST_CHIP_ADSL_LINE_START, NULL, 0, NULL, 0); if (ret < 0) { - atm_err(instance->usbatm, "change adsl state:" + usb_err(instance->usbatm, "change adsl state:" " CHIP_ADSL_LINE_START returned %d\n", ret); ret = -EIO; @@ -396,6 +396,15 @@ static ssize_t adsl_state_store(struct device *dev, poll = -1; } + /* cxacru_poll_status() below dereferences atm_dev, which may not be + * set up yet; reject before poll_state is advanced so that + * cxacru_atm_start() can still start polling once it is. + */ + if (poll == CXPOLL_POLLING && !instance->usbatm->atm_dev) { + ret = -ENODEV; + poll = -1; + } + if (poll == CXPOLL_POLLING) { mutex_lock(&instance->poll_state_serialize); switch (instance->poll_state) { @@ -481,7 +490,7 @@ static ssize_t adsl_config_store(struct device *dev, ret = cxacru_cm(instance, CM_REQUEST_CARD_DATA_SET, (u8 *) data, 4 + num * 8, NULL, 0); if (ret < 0) { - atm_err(instance->usbatm, + usb_err(instance->usbatm, "set card data returned %d\n", ret); return -EIO; } @@ -490,7 +499,7 @@ static ssize_t adsl_config_store(struct device *dev, snprintf(log + tmp*12, 13, " %02x=%08x", le32_to_cpu(data[tmp * 2 + 1]), le32_to_cpu(data[tmp * 2 + 2])); - atm_info(instance->usbatm, "config%s\n", log); + usb_info(instance->usbatm, "config%s\n", log); num = 0; } }