wimax/i2400m: correctly identify all iwmc3200-based SKUs
authorInaky Perez-Gonzalez <inaky@linux.intel.com>
Sat, 24 Oct 2009 00:45:07 +0000 (17:45 -0700)
committerInaky Perez-Gonzalez <inaky@linux.intel.com>
Tue, 3 Nov 2009 20:49:38 +0000 (12:49 -0800)
Different paths of the i2400m SDIO driver need to take care of a few
SKU-specific quirks. For the ones that are common to to all the
iwmc3200 based devices, introduce i2400ms->iwmc3200 [set in
i2400ms_probe()], so it doesn't have to check against the list of
iwmc3200 SKU IDs on each quirk site.

Signed-off-by: Inaky Perez-Gonzalez <inaky@linux.intel.com>
drivers/net/wimax/i2400m/i2400m-sdio.h
drivers/net/wimax/i2400m/sdio.c

index 18218a24a8f869bc30781d26b226ee759f65b913..fba482c08d662e16d46acc7d0a7109d0c8e1b5a7 100644 (file)
@@ -114,6 +114,9 @@ struct i2400ms {
        wait_queue_head_t bm_wfa_wq;
        int bm_wait_result;
        size_t bm_ack_size;
+
+       /* Device is any of the iwmc3200 SKUs */
+       unsigned iwmc3200:1;
 };
 
 
index 20ab22ec291b1d5eabc5997212d75f99b1c3be88..079f900e9ae5239cb561a2798142274249286ed7 100644 (file)
@@ -105,8 +105,9 @@ static const struct i2400m_poke_table i2400ms_pokes[] = {
  *     error (-ENODEV when it was unable to enable the function).
  */
 static
-int i2400ms_enable_function(struct sdio_func *func, unsigned maxtries)
+int i2400ms_enable_function(struct i2400ms *i2400ms, unsigned maxtries)
 {
+       struct sdio_func *func = i2400ms->func;
        u64 timeout;
        int err;
        struct device *dev = &func->dev;
@@ -126,7 +127,7 @@ int i2400ms_enable_function(struct sdio_func *func, unsigned maxtries)
                 * platforms (system hang). We explicitly overwrite
                 * func->enable_timeout here to work around the issue.
                 */
-               if (func->device == SDIO_DEVICE_ID_INTEL_IWMC3200WIMAX)
+               if (i2400ms->iwmc3200)
                        func->enable_timeout = IWMC3200_IOR_TIMEOUT;
                err = sdio_enable_func(func);
                if (0 == err) {
@@ -176,7 +177,7 @@ int i2400ms_bus_setup(struct i2400m *i2400m)
                goto error_set_blk_size;
        }
 
-       result = i2400ms_enable_function(func, 1);
+       result = i2400ms_enable_function(i2400ms, 1);
        if (result < 0) {
                dev_err(dev, "Cannot enable SDIO function: %d\n", result);
                goto error_func_enable;
@@ -487,6 +488,15 @@ int i2400ms_probe(struct sdio_func *func,
        i2400m->bus_bm_mac_addr_impaired = 1;
        i2400m->bus_bm_pokes_table = &i2400ms_pokes[0];
 
+       switch (func->device) {
+       case SDIO_DEVICE_ID_INTEL_IWMC3200WIMAX:
+       case SDIO_DEVICE_ID_INTEL_IWMC3200WIMAX_2G5:
+               i2400ms->iwmc3200 = 1;
+               break;
+       default:
+               i2400ms->iwmc3200 = 0;
+       }
+
        result = i2400m_setup(i2400m, I2400M_BRI_NO_REBOOT);
        if (result < 0) {
                dev_err(dev, "cannot setup device: %d\n", result);