1*7e6ad469SVishal Kulkarni #include "t4_hw.h" 2*7e6ad469SVishal Kulkarni #include "t4_chip_type.h" 3*7e6ad469SVishal Kulkarni #include "common.h" 4*7e6ad469SVishal Kulkarni 5*7e6ad469SVishal Kulkarni /* legacy compatibility routines */ 6*7e6ad469SVishal Kulkarni int t4_memory_rw(struct adapter *adap, int win, 7*7e6ad469SVishal Kulkarni int mtype, u32 maddr, u32 len, 8*7e6ad469SVishal Kulkarni void *hbuf, int dir) 9*7e6ad469SVishal Kulkarni { 10*7e6ad469SVishal Kulkarni return t4_memory_rw_mtype(adap, win, mtype, maddr, len, hbuf, dir); 11*7e6ad469SVishal Kulkarni } 12*7e6ad469SVishal Kulkarni 13*7e6ad469SVishal Kulkarni /** 14*7e6ad469SVishal Kulkarni * hash_mac_addr - return the hash value of a MAC address 15*7e6ad469SVishal Kulkarni * @addr: the 48-bit Ethernet MAC address 16*7e6ad469SVishal Kulkarni * 17*7e6ad469SVishal Kulkarni * Hashes a MAC address according to the hash function used by hardware 18*7e6ad469SVishal Kulkarni * inexact (hash) address matching. The description in the hardware 19*7e6ad469SVishal Kulkarni * documentation for the MPS says this: 20*7e6ad469SVishal Kulkarni * 21*7e6ad469SVishal Kulkarni * The hash function takes the 48 bit MAC address and hashes 22*7e6ad469SVishal Kulkarni * it down to six bits. Bit zero of the hash is the XOR of 23*7e6ad469SVishal Kulkarni * bits 0, 6 ... 42 of the MAC address. The other hash bits 24*7e6ad469SVishal Kulkarni * are computed in a similar fashion ending with bit five of 25*7e6ad469SVishal Kulkarni * the hash as the XOR of bits 5, 11 ... 47 of the MAC address. 26*7e6ad469SVishal Kulkarni */ 27*7e6ad469SVishal Kulkarni int hash_mac_addr(const u8 *addr) 28*7e6ad469SVishal Kulkarni { 29*7e6ad469SVishal Kulkarni u32 a = ((u32)addr[0] << 16) | ((u32)addr[1] << 8) | addr[2]; 30*7e6ad469SVishal Kulkarni u32 b = ((u32)addr[3] << 16) | ((u32)addr[4] << 8) | addr[5]; 31*7e6ad469SVishal Kulkarni 32*7e6ad469SVishal Kulkarni a ^= b; 33*7e6ad469SVishal Kulkarni a ^= (a >> 12); 34*7e6ad469SVishal Kulkarni a ^= (a >> 6); 35*7e6ad469SVishal Kulkarni return a & 0x3f; 36*7e6ad469SVishal Kulkarni } 37*7e6ad469SVishal Kulkarni 38*7e6ad469SVishal Kulkarni int t4_wr_mbox_ns(struct adapter *adap, int mbox, const void *cmd, 39*7e6ad469SVishal Kulkarni int size, void *rpl) 40*7e6ad469SVishal Kulkarni { 41*7e6ad469SVishal Kulkarni return t4_wr_mbox_meat(adap, mbox, cmd, size, rpl, false); 42*7e6ad469SVishal Kulkarni } 43*7e6ad469SVishal Kulkarni 44*7e6ad469SVishal Kulkarni int t4_wr_mbox_timeout(struct adapter *adap, int mbox, 45*7e6ad469SVishal Kulkarni const void *cmd, int size, void *rpl, 46*7e6ad469SVishal Kulkarni int timeout) 47*7e6ad469SVishal Kulkarni { 48*7e6ad469SVishal Kulkarni return t4_wr_mbox_meat_timeout(adap, mbox, cmd, size, rpl, true, 49*7e6ad469SVishal Kulkarni timeout); 50*7e6ad469SVishal Kulkarni } 51*7e6ad469SVishal Kulkarni 52*7e6ad469SVishal Kulkarni unsigned int dack_ticks_to_usec(const struct adapter *adap, 53*7e6ad469SVishal Kulkarni unsigned int ticks) 54*7e6ad469SVishal Kulkarni { 55*7e6ad469SVishal Kulkarni return (ticks << adap->params.tp.dack_re) / core_ticks_per_usec(adap); 56*7e6ad469SVishal Kulkarni } 57*7e6ad469SVishal Kulkarni 58*7e6ad469SVishal Kulkarni unsigned int us_to_core_ticks(const struct adapter *adap, 59*7e6ad469SVishal Kulkarni unsigned int us) 60*7e6ad469SVishal Kulkarni { 61*7e6ad469SVishal Kulkarni return (us * adap->params.vpd.cclk) / 1000; 62*7e6ad469SVishal Kulkarni } 63*7e6ad469SVishal Kulkarni 64*7e6ad469SVishal Kulkarni int is_offload(const struct adapter *adap) 65*7e6ad469SVishal Kulkarni { 66*7e6ad469SVishal Kulkarni return adap->params.offload; 67*7e6ad469SVishal Kulkarni } 68*7e6ad469SVishal Kulkarni 69*7e6ad469SVishal Kulkarni /* 70*7e6ad469SVishal Kulkarni * Given a pointer to a Firmware Mailbox Command Log and a log entry index, 71*7e6ad469SVishal Kulkarni * return a pointer to the specified entry. 72*7e6ad469SVishal Kulkarni */ 73*7e6ad469SVishal Kulkarni struct mbox_cmd *mbox_cmd_log_entry(struct mbox_cmd_log *log, 74*7e6ad469SVishal Kulkarni unsigned int entry_idx) 75*7e6ad469SVishal Kulkarni { 76*7e6ad469SVishal Kulkarni return &((struct mbox_cmd *)&(log)[1])[entry_idx]; 77*7e6ad469SVishal Kulkarni } 78*7e6ad469SVishal Kulkarni 79*7e6ad469SVishal Kulkarni int is_t4(enum chip_type chip) 80*7e6ad469SVishal Kulkarni { 81*7e6ad469SVishal Kulkarni return (CHELSIO_CHIP_VERSION(chip) == CHELSIO_T4); 82*7e6ad469SVishal Kulkarni } 83*7e6ad469SVishal Kulkarni 84*7e6ad469SVishal Kulkarni int is_t5(enum chip_type chip) 85*7e6ad469SVishal Kulkarni { 86*7e6ad469SVishal Kulkarni 87*7e6ad469SVishal Kulkarni return (CHELSIO_CHIP_VERSION(chip) == CHELSIO_T5); 88*7e6ad469SVishal Kulkarni } 89*7e6ad469SVishal Kulkarni 90*7e6ad469SVishal Kulkarni int is_t6(enum chip_type chip) 91*7e6ad469SVishal Kulkarni { 92*7e6ad469SVishal Kulkarni return (CHELSIO_CHIP_VERSION(chip) == CHELSIO_T6); 93*7e6ad469SVishal Kulkarni } 94*7e6ad469SVishal Kulkarni 95*7e6ad469SVishal Kulkarni int is_fpga(enum chip_type chip) 96*7e6ad469SVishal Kulkarni { 97*7e6ad469SVishal Kulkarni return chip & CHELSIO_CHIP_FPGA; 98*7e6ad469SVishal Kulkarni } 99*7e6ad469SVishal Kulkarni 100*7e6ad469SVishal Kulkarni /** 101*7e6ad469SVishal Kulkarni * t4_is_inserted_mod_type - is a plugged in Firmware Module Type 102*7e6ad469SVishal Kulkarni * @fw_mod_type: the Firmware Mofule Type 103*7e6ad469SVishal Kulkarni * 104*7e6ad469SVishal Kulkarni * Return whether the Firmware Module Type represents a real Transceiver 105*7e6ad469SVishal Kulkarni * Module/Cable Module Type which has been inserted. 106*7e6ad469SVishal Kulkarni */ 107*7e6ad469SVishal Kulkarni bool t4_is_inserted_mod_type(unsigned int fw_mod_type) 108*7e6ad469SVishal Kulkarni { 109*7e6ad469SVishal Kulkarni return (fw_mod_type != FW_PORT_MOD_TYPE_NONE && 110*7e6ad469SVishal Kulkarni fw_mod_type != FW_PORT_MOD_TYPE_NOTSUPPORTED && 111*7e6ad469SVishal Kulkarni fw_mod_type != FW_PORT_MOD_TYPE_UNKNOWN && 112*7e6ad469SVishal Kulkarni fw_mod_type != FW_PORT_MOD_TYPE_ERROR); 113*7e6ad469SVishal Kulkarni } 114*7e6ad469SVishal Kulkarni 115*7e6ad469SVishal Kulkarni int t4_wr_mbox(struct adapter *adap, int mbox, const void *cmd, 116*7e6ad469SVishal Kulkarni int size, void *rpl) 117*7e6ad469SVishal Kulkarni { 118*7e6ad469SVishal Kulkarni return t4_wr_mbox_meat(adap, mbox, cmd, size, rpl, true); 119*7e6ad469SVishal Kulkarni } 120*7e6ad469SVishal Kulkarni 121*7e6ad469SVishal Kulkarni unsigned int core_ticks_per_usec(const struct adapter *adap) 122*7e6ad469SVishal Kulkarni { 123*7e6ad469SVishal Kulkarni return adap->params.vpd.cclk / 1000; 124*7e6ad469SVishal Kulkarni } 125