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