liquidio: fix for vf mac addr command sent to nic firmware
authorRick Farrington <ricardo.farrington@cavium.com>
Fri, 17 Mar 2017 22:43:26 +0000 (15:43 -0700)
committerDavid S. Miller <davem@davemloft.net>
Wed, 22 Mar 2017 00:48:29 +0000 (17:48 -0700)
Change to support host<->firmware command return value.
Fix for vf mac addr state command.
1. Added support for firmware commands to return a value:
   - previously, the returned code overlapped with host codes, thus
     commands were only returning 0 (success) or -1 (interpreted as
     timeout)
   - per 'response_manager.h', the error codes are split into two fields
     (major/minor) now, firmware commands are grouped into their own
     'major' group, separate from the host's 'major' group, which allow f/w
     commands to return any 16-bit value
2. The command to set vf mac addr was logging a success message even if
   command failed.  Now command uses a callback function to log the status
   message.
3. The command to set vf mac addr was not logging a message when set via
   the host 'ip' command.  Now, the callback function will log an
   appropriate message.

Signed-off-by: Rick Farrington <ricardo.farrington@cavium.com>
Signed-off-by: Felix Manlunas <felix.manlunas@cavium.com>
Signed-off-by: Derek Chickles <derek.chickles@cavium.com>
Signed-off-by: Satanand Burla <satananda.burla@cavium.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/cavium/liquidio/lio_core.c
drivers/net/ethernet/cavium/liquidio/lio_main.c
drivers/net/ethernet/cavium/liquidio/response_manager.c
drivers/net/ethernet/cavium/liquidio/response_manager.h

index f629c2fe04a44b16794db66d2a3e4c6bf5c09876..65a1a9e7a1594135488f3f3bdd5c8aaf70ab8434 100644 (file)
@@ -131,11 +131,20 @@ void liquidio_link_ctrl_cmd_completion(void *nctrl_ptr)
 
        case OCTNET_CMD_CHANGE_MACADDR:
                mac = ((u8 *)&nctrl->udd[0]) + 2;
-               netif_info(lio, probe, lio->netdev,
-                          "MACAddr changed to %2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x\n",
-                          mac[0], mac[1],
-                          mac[2], mac[3],
-                          mac[4], mac[5]);
+               if (nctrl->ncmd.s.param1) {
+                       /* vfidx is 0 based, but vf_num (param1) is 1 based */
+                       int vfidx = nctrl->ncmd.s.param1 - 1;
+                       bool mac_is_admin_assigned = nctrl->ncmd.s.param2;
+
+                       if (mac_is_admin_assigned)
+                               netif_info(lio, probe, lio->netdev,
+                                          "MAC Address %pM is configured for VF %d\n",
+                                          mac, vfidx);
+               } else {
+                       netif_info(lio, probe, lio->netdev,
+                                  " MACAddr changed to %pM\n",
+                                  mac);
+               }
                break;
 
        case OCTNET_CMD_CHANGE_MTU:
index afa173de1042bf1f0213bb0d8fd6078f7c6b8062..b23485c3af13225fdcaca29c4a3d3871958eb707 100644 (file)
@@ -3619,7 +3619,8 @@ static int __liquidio_set_vf_mac(struct net_device *netdev, int vfidx,
        nctrl.ncmd.s.param2 = (is_admin_assigned ? 1 : 0);
        nctrl.ncmd.s.more = 1;
        nctrl.iq_no = lio->linfo.txpciq[0].s.q_no;
-       nctrl.cb_fn = 0;
+       nctrl.netpndev = (u64)netdev;
+       nctrl.cb_fn = liquidio_link_ctrl_cmd_completion;
        nctrl.wait_time = LIO_CMD_WAIT_TM;
 
        nctrl.udd[0] = 0;
index 9456333397233e314c9ec57b0cfe7cfcfb77a46d..3d691c69f74d1cf7567b2d58730dcfd656c0eefd 100644 (file)
@@ -101,8 +101,15 @@ int lio_process_ordered_list(struct octeon_device *octeon_dev,
                        if ((status64 & 0xff) != 0xff) {
                                octeon_swap_8B_data(&status64, 1);
                                if (((status64 & 0xff) != 0xff)) {
-                                       status = (u32)(status64 &
-                                                      0xffffffffULL);
+                                       /* retrieve 16-bit firmware status */
+                                       status = (u32)(status64 & 0xffffULL);
+                                       if (status) {
+                                               status =
+                                                 FIRMWARE_STATUS_CODE(status);
+                                       } else {
+                                               /* i.e. no error */
+                                               status = OCTEON_REQUEST_DONE;
+                                       }
                                }
                        }
                } else if (force_quit || (sc->timeout &&
index cbb2d84e89323aea4852c31c164c2ff49c40257c..9169c2815dba36c59b7b8cea5642a7fb27bff439 100644 (file)
@@ -78,6 +78,8 @@ enum {
 
 /*------------   Error codes used by host driver   -----------------*/
 #define DRIVER_MAJOR_ERROR_CODE           0x0000
+/*------   Error codes used by firmware (bits 15..0 set by firmware */
+#define FIRMWARE_MAJOR_ERROR_CODE         0x0001
 
 /**  A value of 0x00000000 indicates no error i.e. success */
 #define DRIVER_ERROR_NONE                 0x00000000
@@ -116,6 +118,9 @@ enum {
 
 };
 
+#define FIRMWARE_STATUS_CODE(status) \
+       ((FIRMWARE_MAJOR_ERROR_CODE << 16) | (status))
+
 /** Initialize the response lists. The number of response lists to create is
  * given by count.
  * @param octeon_dev      - the octeon device structure.