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