drivers/net: delete non-required instances of include <linux/init.h>
[sfrench/cifs-2.6.git] / drivers / net / ethernet / chelsio / cxgb4 / t4_hw.c
index 74a6fce5a15a6914faf74bbf903dcc76ec717775..2c109343d57083a651bcaf9ef08772dd8029ec1f 100644 (file)
  * SOFTWARE.
  */
 
-#include <linux/init.h>
 #include <linux/delay.h>
 #include "cxgb4.h"
 #include "t4_regs.h"
 #include "t4fw_api.h"
 
+static int t4_fw_upgrade(struct adapter *adap, unsigned int mbox,
+                        const u8 *fw_data, unsigned int size, int force);
 /**
  *     t4_wait_op_done_val - wait until an operation is completed
  *     @adapter: the adapter performing the operation
@@ -1069,62 +1070,6 @@ unsigned int t4_flash_cfg_addr(struct adapter *adapter)
                return FLASH_CFG_START;
 }
 
-/**
- *     t4_load_cfg - download config file
- *     @adap: the adapter
- *     @cfg_data: the cfg text file to write
- *     @size: text file size
- *
- *     Write the supplied config text file to the card's serial flash.
- */
-int t4_load_cfg(struct adapter *adap, const u8 *cfg_data, unsigned int size)
-{
-       int ret, i, n;
-       unsigned int addr;
-       unsigned int flash_cfg_start_sec;
-       unsigned int sf_sec_size = adap->params.sf_size / adap->params.sf_nsec;
-
-       addr = t4_flash_cfg_addr(adap);
-       flash_cfg_start_sec = addr / SF_SEC_SIZE;
-
-       if (size > FLASH_CFG_MAX_SIZE) {
-               dev_err(adap->pdev_dev, "cfg file too large, max is %u bytes\n",
-                       FLASH_CFG_MAX_SIZE);
-               return -EFBIG;
-       }
-
-       i = DIV_ROUND_UP(FLASH_CFG_MAX_SIZE,    /* # of sectors spanned */
-                        sf_sec_size);
-       ret = t4_flash_erase_sectors(adap, flash_cfg_start_sec,
-                                    flash_cfg_start_sec + i - 1);
-       /*
-        * If size == 0 then we're simply erasing the FLASH sectors associated
-        * with the on-adapter Firmware Configuration File.
-        */
-       if (ret || size == 0)
-               goto out;
-
-       /* this will write to the flash up to SF_PAGE_SIZE at a time */
-       for (i = 0; i < size; i += SF_PAGE_SIZE) {
-               if ((size - i) <  SF_PAGE_SIZE)
-                       n = size - i;
-               else
-                       n = SF_PAGE_SIZE;
-               ret = t4_write_flash(adap, addr, n, cfg_data);
-               if (ret)
-                       goto out;
-
-               addr += SF_PAGE_SIZE;
-               cfg_data += SF_PAGE_SIZE;
-       }
-
-out:
-       if (ret)
-               dev_err(adap->pdev_dev, "config file %s failed %d\n",
-                       (size == 0 ? "clear" : "download"), ret);
-       return ret;
-}
-
 /**
  *     t4_load_fw - download firmware
  *     @adap: the adapter
@@ -2810,7 +2755,7 @@ int t4_fw_reset(struct adapter *adap, unsigned int mbox, int reset)
  *     be doing.  The only way out of this state is to RESTART the firmware
  *     ...
  */
-int t4_fw_halt(struct adapter *adap, unsigned int mbox, int force)
+static int t4_fw_halt(struct adapter *adap, unsigned int mbox, int force)
 {
        int ret = 0;
 
@@ -2875,7 +2820,7 @@ int t4_fw_halt(struct adapter *adap, unsigned int mbox, int force)
  *         the chip since older firmware won't recognize the PCIE_FW.HALT
  *         flag and automatically RESET itself on startup.
  */
-int t4_fw_restart(struct adapter *adap, unsigned int mbox, int reset)
+static int t4_fw_restart(struct adapter *adap, unsigned int mbox, int reset)
 {
        if (reset) {
                /*
@@ -2938,8 +2883,8 @@ int t4_fw_restart(struct adapter *adap, unsigned int mbox, int reset)
  *     positive errno indicates that the adapter is ~probably~ intact, a
  *     negative errno indicates that things are looking bad ...
  */
-int t4_fw_upgrade(struct adapter *adap, unsigned int mbox,
-                 const u8 *fw_data, unsigned int size, int force)
+static int t4_fw_upgrade(struct adapter *adap, unsigned int mbox,
+                        const u8 *fw_data, unsigned int size, int force)
 {
        const struct fw_hdr *fw_hdr = (const struct fw_hdr *)fw_data;
        int reset, ret;
@@ -2964,78 +2909,6 @@ int t4_fw_upgrade(struct adapter *adap, unsigned int mbox,
        return t4_fw_restart(adap, mbox, reset);
 }
 
-
-/**
- *     t4_fw_config_file - setup an adapter via a Configuration File
- *     @adap: the adapter
- *     @mbox: mailbox to use for the FW command
- *     @mtype: the memory type where the Configuration File is located
- *     @maddr: the memory address where the Configuration File is located
- *     @finiver: return value for CF [fini] version
- *     @finicsum: return value for CF [fini] checksum
- *     @cfcsum: return value for CF computed checksum
- *
- *     Issue a command to get the firmware to process the Configuration
- *     File located at the specified mtype/maddress.  If the Configuration
- *     File is processed successfully and return value pointers are
- *     provided, the Configuration File "[fini] section version and
- *     checksum values will be returned along with the computed checksum.
- *     It's up to the caller to decide how it wants to respond to the
- *     checksums not matching but it recommended that a prominant warning
- *     be emitted in order to help people rapidly identify changed or
- *     corrupted Configuration Files.
- *
- *     Also note that it's possible to modify things like "niccaps",
- *     "toecaps",etc. between processing the Configuration File and telling
- *     the firmware to use the new configuration.  Callers which want to
- *     do this will need to "hand-roll" their own CAPS_CONFIGS commands for
- *     Configuration Files if they want to do this.
- */
-int t4_fw_config_file(struct adapter *adap, unsigned int mbox,
-                     unsigned int mtype, unsigned int maddr,
-                     u32 *finiver, u32 *finicsum, u32 *cfcsum)
-{
-       struct fw_caps_config_cmd caps_cmd;
-       int ret;
-
-       /*
-        * Tell the firmware to process the indicated Configuration File.
-        * If there are no errors and the caller has provided return value
-        * pointers for the [fini] section version, checksum and computed
-        * checksum, pass those back to the caller.
-        */
-       memset(&caps_cmd, 0, sizeof(caps_cmd));
-       caps_cmd.op_to_write =
-               htonl(FW_CMD_OP(FW_CAPS_CONFIG_CMD) |
-                     FW_CMD_REQUEST |
-                     FW_CMD_READ);
-       caps_cmd.cfvalid_to_len16 =
-               htonl(FW_CAPS_CONFIG_CMD_CFVALID |
-                     FW_CAPS_CONFIG_CMD_MEMTYPE_CF(mtype) |
-                     FW_CAPS_CONFIG_CMD_MEMADDR64K_CF(maddr >> 16) |
-                     FW_LEN16(caps_cmd));
-       ret = t4_wr_mbox(adap, mbox, &caps_cmd, sizeof(caps_cmd), &caps_cmd);
-       if (ret < 0)
-               return ret;
-
-       if (finiver)
-               *finiver = ntohl(caps_cmd.finiver);
-       if (finicsum)
-               *finicsum = ntohl(caps_cmd.finicsum);
-       if (cfcsum)
-               *cfcsum = ntohl(caps_cmd.cfcsum);
-
-       /*
-        * And now tell the firmware to use the configuration we just loaded.
-        */
-       caps_cmd.op_to_write =
-               htonl(FW_CMD_OP(FW_CAPS_CONFIG_CMD) |
-                     FW_CMD_REQUEST |
-                     FW_CMD_WRITE);
-       caps_cmd.cfvalid_to_len16 = htonl(FW_LEN16(caps_cmd));
-       return t4_wr_mbox(adap, mbox, &caps_cmd, sizeof(caps_cmd), NULL);
-}
-
 /**
  *     t4_fixup_host_params - fix up host-dependent parameters
  *     @adap: the adapter
@@ -3808,6 +3681,109 @@ int t4_prep_adapter(struct adapter *adapter)
        return 0;
 }
 
+/**
+ *      t4_init_tp_params - initialize adap->params.tp
+ *      @adap: the adapter
+ *
+ *      Initialize various fields of the adapter's TP Parameters structure.
+ */
+int t4_init_tp_params(struct adapter *adap)
+{
+       int chan;
+       u32 v;
+
+       v = t4_read_reg(adap, TP_TIMER_RESOLUTION);
+       adap->params.tp.tre = TIMERRESOLUTION_GET(v);
+       adap->params.tp.dack_re = DELAYEDACKRESOLUTION_GET(v);
+
+       /* MODQ_REQ_MAP defaults to setting queues 0-3 to chan 0-3 */
+       for (chan = 0; chan < NCHAN; chan++)
+               adap->params.tp.tx_modq[chan] = chan;
+
+       /* Cache the adapter's Compressed Filter Mode and global Incress
+        * Configuration.
+        */
+       t4_read_indirect(adap, TP_PIO_ADDR, TP_PIO_DATA,
+                        &adap->params.tp.vlan_pri_map, 1,
+                        TP_VLAN_PRI_MAP);
+       t4_read_indirect(adap, TP_PIO_ADDR, TP_PIO_DATA,
+                        &adap->params.tp.ingress_config, 1,
+                        TP_INGRESS_CONFIG);
+
+       /* Now that we have TP_VLAN_PRI_MAP cached, we can calculate the field
+        * shift positions of several elements of the Compressed Filter Tuple
+        * for this adapter which we need frequently ...
+        */
+       adap->params.tp.vlan_shift = t4_filter_field_shift(adap, F_VLAN);
+       adap->params.tp.vnic_shift = t4_filter_field_shift(adap, F_VNIC_ID);
+       adap->params.tp.port_shift = t4_filter_field_shift(adap, F_PORT);
+       adap->params.tp.protocol_shift = t4_filter_field_shift(adap,
+                                                              F_PROTOCOL);
+
+       /* If TP_INGRESS_CONFIG.VNID == 0, then TP_VLAN_PRI_MAP.VNIC_ID
+        * represents the presense of an Outer VLAN instead of a VNIC ID.
+        */
+       if ((adap->params.tp.ingress_config & F_VNIC) == 0)
+               adap->params.tp.vnic_shift = -1;
+
+       return 0;
+}
+
+/**
+ *      t4_filter_field_shift - calculate filter field shift
+ *      @adap: the adapter
+ *      @filter_sel: the desired field (from TP_VLAN_PRI_MAP bits)
+ *
+ *      Return the shift position of a filter field within the Compressed
+ *      Filter Tuple.  The filter field is specified via its selection bit
+ *      within TP_VLAN_PRI_MAL (filter mode).  E.g. F_VLAN.
+ */
+int t4_filter_field_shift(const struct adapter *adap, int filter_sel)
+{
+       unsigned int filter_mode = adap->params.tp.vlan_pri_map;
+       unsigned int sel;
+       int field_shift;
+
+       if ((filter_mode & filter_sel) == 0)
+               return -1;
+
+       for (sel = 1, field_shift = 0; sel < filter_sel; sel <<= 1) {
+               switch (filter_mode & sel) {
+               case F_FCOE:
+                       field_shift += W_FT_FCOE;
+                       break;
+               case F_PORT:
+                       field_shift += W_FT_PORT;
+                       break;
+               case F_VNIC_ID:
+                       field_shift += W_FT_VNIC_ID;
+                       break;
+               case F_VLAN:
+                       field_shift += W_FT_VLAN;
+                       break;
+               case F_TOS:
+                       field_shift += W_FT_TOS;
+                       break;
+               case F_PROTOCOL:
+                       field_shift += W_FT_PROTOCOL;
+                       break;
+               case F_ETHERTYPE:
+                       field_shift += W_FT_ETHERTYPE;
+                       break;
+               case F_MACMATCH:
+                       field_shift += W_FT_MACMATCH;
+                       break;
+               case F_MPSHITTYPE:
+                       field_shift += W_FT_MPSHITTYPE;
+                       break;
+               case F_FRAGMENTATION:
+                       field_shift += W_FT_FRAGMENTATION;
+                       break;
+               }
+       }
+       return field_shift;
+}
+
 int t4_port_init(struct adapter *adap, int mbox, int pf, int vf)
 {
        u8 addr[6];