staging: vt6656: Move device_set_multi code call to vRunCommand
authorMalcolm Priestley <tvboxspy@gmail.com>
Wed, 19 Feb 2014 19:34:18 +0000 (19:34 +0000)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 25 Feb 2014 00:55:41 +0000 (16:55 -0800)
device_set_multi is an atomic call, in order to reduce atomic area of driver
move code to be called from vRunCommand.

Later the atomic area of vRunCommand can be reduced.

Change existing code in device_set_multi to new function
vnt_configure_filter minus its locks.

Change device_set_multi to call bScheduleCommand

device_set_multi is nolonger called from device open.

Signed-off-by: Malcolm Priestley <tvboxspy@gmail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/vt6656/device.h
drivers/staging/vt6656/main_usb.c
drivers/staging/vt6656/wcmd.c
drivers/staging/vt6656/wcmd.h

index 33e5e34001893c4293063d9b27a3bfca3b7e5691..7e774b239a2f0fff548e9f19824d79168dd01386 100644 (file)
@@ -789,5 +789,6 @@ struct vnt_private {
                                  (fMP_DISCONNECTED | fMP_RESET_IN_PROGRESS | fMP_HALT_IN_PROGRESS | fMP_INIT_IN_PROGRESS | fMP_SURPRISE_REMOVED)) == 0)
 
 int device_alloc_frag_buf(struct vnt_private *, PSDeFragControlBlock pDeF);
+void vnt_configure_filter(struct vnt_private *);
 
 #endif
index 713844fa832097a10387997043152c263996b0f3..77830509c52e678dc4bb204fda6b1bdc717a91ac 100644 (file)
@@ -974,8 +974,6 @@ static int  device_open(struct net_device *dev)
                goto free_all;
        }
 
-    device_set_multi(pDevice->dev);
-
     /* init for key management */
     KeyvInitTable(pDevice,&pDevice->sKey);
        memcpy(pDevice->vnt_mgmt.abyMACAddr,
@@ -1349,14 +1347,26 @@ static int Read_config_file(struct vnt_private *pDevice)
 static void device_set_multi(struct net_device *dev)
 {
        struct vnt_private *priv = netdev_priv(dev);
+       unsigned long flags;
+
+       if (priv->flags & DEVICE_FLAGS_OPENED) {
+               spin_lock_irqsave(&priv->lock, flags);
+
+               bScheduleCommand(priv, WLAN_CMD_CONFIGURE_FILTER, NULL);
+
+               spin_unlock_irqrestore(&priv->lock, flags);
+       }
+}
+
+void vnt_configure_filter(struct vnt_private *priv)
+{
+       struct net_device *dev = priv->dev;
        struct vnt_manager *mgmt = &priv->vnt_mgmt;
        struct netdev_hw_addr *ha;
        u64 mc_filter = 0;
        u8 tmp = 0;
        int rc;
 
-       spin_lock_irq(&priv->lock);
-
        rc = CONTROLnsRequestIn(priv, MESSAGE_TYPE_READ,
                MAC_REG_RCR, MESSAGE_REQUEST_MACREG, 1, &tmp);
        if (rc == 0)
@@ -1403,8 +1413,6 @@ static void device_set_multi(struct net_device *dev)
 
        DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO
                                "priv->byRxMode out= %x\n", priv->byRxMode);
-
-       spin_unlock_irq(&priv->lock);
 }
 
 static struct net_device_stats *device_get_stats(struct net_device *dev)
index 6b9522914634fa3a7db5b69e89483db648ea8823..8c702c3797398fb6b2b438a0bf8111e29e7686d1 100644 (file)
@@ -909,6 +909,10 @@ void vRunCommand(struct work_struct *work)
                s_bCommandComplete(pDevice);
                break;
 
+       case WLAN_CMD_CONFIGURE_FILTER_START:
+               vnt_configure_filter(pDevice);
+               s_bCommandComplete(pDevice);
+               break;
        default:
                s_bCommandComplete(pDevice);
                break;
@@ -1009,6 +1013,11 @@ static int s_bCommandComplete(struct vnt_private *pDevice)
                        pDevice->eCommandState = WLAN_CMD_11H_CHSW_START;
                        break;
 
+               case WLAN_CMD_CONFIGURE_FILTER:
+                       pDevice->eCommandState =
+                                               WLAN_CMD_CONFIGURE_FILTER_START;
+                       break;
+
                default:
                        break;
                }
index caf2684ce9151f34961d5d203e4e7949c5d5b9da..736572101badce8191ec58b9f744f95cce8a282f 100644 (file)
@@ -51,7 +51,8 @@ typedef enum tagCMD_CODE {
     WLAN_CMD_REMOVE_ALLKEY,
     WLAN_CMD_MAC_DISPOWERSAVING,
     WLAN_CMD_11H_CHSW,
-    WLAN_CMD_RUN_AP
+    WLAN_CMD_RUN_AP,
+    WLAN_CMD_CONFIGURE_FILTER
 } CMD_CODE, *PCMD_CODE;
 
 #define CMD_Q_SIZE              32
@@ -96,6 +97,7 @@ typedef enum tagCMD_STATE {
     WLAN_CMD_REMOVE_ALLKEY_START,
     WLAN_CMD_MAC_DISPOWERSAVING_START,
     WLAN_CMD_11H_CHSW_START,
+    WLAN_CMD_CONFIGURE_FILTER_START,
     WLAN_CMD_IDLE
 } CMD_STATE, *PCMD_STATE;