Commit e9a6b45b authored by Inaky Perez-Gonzalez's avatar Inaky Perez-Gonzalez

wimax/i2400m: i2400m's work queue should be initialized before RX support

RX support is the only user of the work-queue, to process
reports/notifications from the device. Thus, it needs the work queue
to be initialized first.
Signed-off-by: default avatarInaky Perez-Gonzalez <inaky@linux.intel.com>
parent fff10685
...@@ -385,6 +385,11 @@ int i2400m_check_mac_addr(struct i2400m *i2400m) ...@@ -385,6 +385,11 @@ int i2400m_check_mac_addr(struct i2400m *i2400m)
* Uploads firmware and brings up all the resources needed to be able * Uploads firmware and brings up all the resources needed to be able
* to communicate with the device. * to communicate with the device.
* *
* The workqueue has to be setup early, at least before RX handling
* (it's only real user for now) so it can process reports as they
* arrive. We also want to destroy it if we retry, to make sure it is
* flushed...easier like this.
*
* TX needs to be setup before the bus-specific code (otherwise on * TX needs to be setup before the bus-specific code (otherwise on
* shutdown, the bus-tx code could try to access it). * shutdown, the bus-tx code could try to access it).
*/ */
...@@ -410,15 +415,15 @@ int __i2400m_dev_start(struct i2400m *i2400m, enum i2400m_bri flags) ...@@ -410,15 +415,15 @@ int __i2400m_dev_start(struct i2400m *i2400m, enum i2400m_bri flags)
result = i2400m_rx_setup(i2400m); result = i2400m_rx_setup(i2400m);
if (result < 0) if (result < 0)
goto error_rx_setup; goto error_rx_setup;
result = i2400m->bus_dev_start(i2400m);
if (result < 0)
goto error_bus_dev_start;
i2400m->work_queue = create_singlethread_workqueue(wimax_dev->name); i2400m->work_queue = create_singlethread_workqueue(wimax_dev->name);
if (i2400m->work_queue == NULL) { if (i2400m->work_queue == NULL) {
result = -ENOMEM; result = -ENOMEM;
dev_err(dev, "cannot create workqueue\n"); dev_err(dev, "cannot create workqueue\n");
goto error_create_workqueue; goto error_create_workqueue;
} }
result = i2400m->bus_dev_start(i2400m);
if (result < 0)
goto error_bus_dev_start;
result = i2400m_firmware_check(i2400m); /* fw versions ok? */ result = i2400m_firmware_check(i2400m); /* fw versions ok? */
if (result < 0) if (result < 0)
goto error_fw_check; goto error_fw_check;
...@@ -440,10 +445,10 @@ int __i2400m_dev_start(struct i2400m *i2400m, enum i2400m_bri flags) ...@@ -440,10 +445,10 @@ int __i2400m_dev_start(struct i2400m *i2400m, enum i2400m_bri flags)
error_dev_initialize: error_dev_initialize:
error_check_mac_addr: error_check_mac_addr:
error_fw_check: error_fw_check:
destroy_workqueue(i2400m->work_queue);
error_create_workqueue:
i2400m->bus_dev_stop(i2400m); i2400m->bus_dev_stop(i2400m);
error_bus_dev_start: error_bus_dev_start:
destroy_workqueue(i2400m->work_queue);
error_create_workqueue:
i2400m_rx_release(i2400m); i2400m_rx_release(i2400m);
error_rx_setup: error_rx_setup:
i2400m_tx_release(i2400m); i2400m_tx_release(i2400m);
...@@ -479,7 +484,9 @@ int i2400m_dev_start(struct i2400m *i2400m, enum i2400m_bri bm_flags) ...@@ -479,7 +484,9 @@ int i2400m_dev_start(struct i2400m *i2400m, enum i2400m_bri bm_flags)
* *
* Returns: 0 if ok, < 0 errno code on error. * Returns: 0 if ok, < 0 errno code on error.
* *
* Releases all the resources allocated to communicate with the device. * Releases all the resources allocated to communicate with the
* device. Note we cannot destroy the workqueue earlier as until RX is
* fully destroyed, it could still try to schedule jobs.
*/ */
static static
void __i2400m_dev_stop(struct i2400m *i2400m) void __i2400m_dev_stop(struct i2400m *i2400m)
...@@ -491,8 +498,8 @@ void __i2400m_dev_stop(struct i2400m *i2400m) ...@@ -491,8 +498,8 @@ void __i2400m_dev_stop(struct i2400m *i2400m)
wimax_state_change(wimax_dev, __WIMAX_ST_QUIESCING); wimax_state_change(wimax_dev, __WIMAX_ST_QUIESCING);
i2400m_dev_shutdown(i2400m); i2400m_dev_shutdown(i2400m);
i2400m->ready = 0; i2400m->ready = 0;
destroy_workqueue(i2400m->work_queue);
i2400m->bus_dev_stop(i2400m); i2400m->bus_dev_stop(i2400m);
destroy_workqueue(i2400m->work_queue);
i2400m_rx_release(i2400m); i2400m_rx_release(i2400m);
i2400m_tx_release(i2400m); i2400m_tx_release(i2400m);
wimax_state_change(wimax_dev, WIMAX_ST_DOWN); wimax_state_change(wimax_dev, WIMAX_ST_DOWN);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment