Commit 9549c6c8 authored by Rick Farrington's avatar Rick Farrington Committed by David S. Miller

liquidio: fix for vf mac addr command sent to nic firmware

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: default avatarRick Farrington <ricardo.farrington@cavium.com>
Signed-off-by: default avatarFelix Manlunas <felix.manlunas@cavium.com>
Signed-off-by: default avatarDerek Chickles <derek.chickles@cavium.com>
Signed-off-by: default avatarSatanand Burla <satananda.burla@cavium.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 71dbc341
...@@ -131,11 +131,20 @@ void liquidio_link_ctrl_cmd_completion(void *nctrl_ptr) ...@@ -131,11 +131,20 @@ void liquidio_link_ctrl_cmd_completion(void *nctrl_ptr)
case OCTNET_CMD_CHANGE_MACADDR: case OCTNET_CMD_CHANGE_MACADDR:
mac = ((u8 *)&nctrl->udd[0]) + 2; mac = ((u8 *)&nctrl->udd[0]) + 2;
netif_info(lio, probe, lio->netdev, if (nctrl->ncmd.s.param1) {
"MACAddr changed to %2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x\n", /* vfidx is 0 based, but vf_num (param1) is 1 based */
mac[0], mac[1], int vfidx = nctrl->ncmd.s.param1 - 1;
mac[2], mac[3], bool mac_is_admin_assigned = nctrl->ncmd.s.param2;
mac[4], mac[5]);
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; break;
case OCTNET_CMD_CHANGE_MTU: case OCTNET_CMD_CHANGE_MTU:
......
...@@ -3619,7 +3619,8 @@ static int __liquidio_set_vf_mac(struct net_device *netdev, int vfidx, ...@@ -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.param2 = (is_admin_assigned ? 1 : 0);
nctrl.ncmd.s.more = 1; nctrl.ncmd.s.more = 1;
nctrl.iq_no = lio->linfo.txpciq[0].s.q_no; 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.wait_time = LIO_CMD_WAIT_TM;
nctrl.udd[0] = 0; nctrl.udd[0] = 0;
......
...@@ -101,8 +101,15 @@ int lio_process_ordered_list(struct octeon_device *octeon_dev, ...@@ -101,8 +101,15 @@ int lio_process_ordered_list(struct octeon_device *octeon_dev,
if ((status64 & 0xff) != 0xff) { if ((status64 & 0xff) != 0xff) {
octeon_swap_8B_data(&status64, 1); octeon_swap_8B_data(&status64, 1);
if (((status64 & 0xff) != 0xff)) { if (((status64 & 0xff) != 0xff)) {
status = (u32)(status64 & /* retrieve 16-bit firmware status */
0xffffffffULL); 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 && } else if (force_quit || (sc->timeout &&
......
...@@ -78,6 +78,8 @@ enum { ...@@ -78,6 +78,8 @@ enum {
/*------------ Error codes used by host driver -----------------*/ /*------------ Error codes used by host driver -----------------*/
#define DRIVER_MAJOR_ERROR_CODE 0x0000 #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 */ /** A value of 0x00000000 indicates no error i.e. success */
#define DRIVER_ERROR_NONE 0x00000000 #define DRIVER_ERROR_NONE 0x00000000
...@@ -116,6 +118,9 @@ enum { ...@@ -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 /** Initialize the response lists. The number of response lists to create is
* given by count. * given by count.
* @param octeon_dev - the octeon device structure. * @param octeon_dev - the octeon device structure.
......
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