.. | .. |
---|
37 | 37 | #define __CHCR_CORE_H__ |
---|
38 | 38 | |
---|
39 | 39 | #include <crypto/algapi.h> |
---|
| 40 | +#include <net/tls.h> |
---|
40 | 41 | #include "t4_hw.h" |
---|
41 | 42 | #include "cxgb4.h" |
---|
42 | 43 | #include "t4_msg.h" |
---|
43 | 44 | #include "cxgb4_uld.h" |
---|
44 | 45 | |
---|
45 | 46 | #define DRV_MODULE_NAME "chcr" |
---|
46 | | -#define DRV_VERSION "1.0.0.0" |
---|
| 47 | +#define DRV_VERSION "1.0.0.0-ko" |
---|
| 48 | +#define DRV_DESC "Chelsio T6 Crypto Co-processor Driver" |
---|
47 | 49 | |
---|
48 | 50 | #define MAX_PENDING_REQ_TO_HW 20 |
---|
49 | 51 | #define CHCR_TEST_RESPONSE_TIMEOUT 1000 |
---|
50 | | - |
---|
| 52 | +#define WQ_DETACH_TM (msecs_to_jiffies(50)) |
---|
51 | 53 | #define PAD_ERROR_BIT 1 |
---|
52 | 54 | #define CHK_PAD_ERR_BIT(x) (((x) >> PAD_ERROR_BIT) & 1) |
---|
53 | 55 | |
---|
.. | .. |
---|
61 | 63 | #define HASH_WR_MIN_LEN (sizeof(struct chcr_wr) + \ |
---|
62 | 64 | DUMMY_BYTES + \ |
---|
63 | 65 | sizeof(struct ulptx_sgl)) |
---|
64 | | - |
---|
65 | | -#define padap(dev) pci_get_drvdata(dev->u_ctx->lldi.pdev) |
---|
66 | | - |
---|
67 | 66 | struct uld_ctx; |
---|
68 | 67 | |
---|
69 | 68 | struct _key_ctx { |
---|
70 | 69 | __be32 ctx_hdr; |
---|
71 | 70 | u8 salt[MAX_SALT]; |
---|
72 | 71 | __be64 iv_to_auth; |
---|
73 | | - unsigned char key[0]; |
---|
| 72 | + unsigned char key[]; |
---|
74 | 73 | }; |
---|
75 | 74 | |
---|
76 | | -#define KEYCTX_TX_WR_IV_S 55 |
---|
77 | | -#define KEYCTX_TX_WR_IV_M 0x1ffULL |
---|
78 | | -#define KEYCTX_TX_WR_IV_V(x) ((x) << KEYCTX_TX_WR_IV_S) |
---|
79 | | -#define KEYCTX_TX_WR_IV_G(x) \ |
---|
80 | | - (((x) >> KEYCTX_TX_WR_IV_S) & KEYCTX_TX_WR_IV_M) |
---|
| 75 | +#define WQ_RETRY 5 |
---|
| 76 | +struct chcr_driver_data { |
---|
| 77 | + struct list_head act_dev; |
---|
| 78 | + struct list_head inact_dev; |
---|
| 79 | + atomic_t dev_count; |
---|
| 80 | + struct mutex drv_mutex; |
---|
| 81 | + struct uld_ctx *last_dev; |
---|
| 82 | +}; |
---|
81 | 83 | |
---|
82 | | -#define KEYCTX_TX_WR_AAD_S 47 |
---|
83 | | -#define KEYCTX_TX_WR_AAD_M 0xffULL |
---|
84 | | -#define KEYCTX_TX_WR_AAD_V(x) ((x) << KEYCTX_TX_WR_AAD_S) |
---|
85 | | -#define KEYCTX_TX_WR_AAD_G(x) (((x) >> KEYCTX_TX_WR_AAD_S) & \ |
---|
86 | | - KEYCTX_TX_WR_AAD_M) |
---|
87 | | - |
---|
88 | | -#define KEYCTX_TX_WR_AADST_S 39 |
---|
89 | | -#define KEYCTX_TX_WR_AADST_M 0xffULL |
---|
90 | | -#define KEYCTX_TX_WR_AADST_V(x) ((x) << KEYCTX_TX_WR_AADST_S) |
---|
91 | | -#define KEYCTX_TX_WR_AADST_G(x) \ |
---|
92 | | - (((x) >> KEYCTX_TX_WR_AADST_S) & KEYCTX_TX_WR_AADST_M) |
---|
93 | | - |
---|
94 | | -#define KEYCTX_TX_WR_CIPHER_S 30 |
---|
95 | | -#define KEYCTX_TX_WR_CIPHER_M 0x1ffULL |
---|
96 | | -#define KEYCTX_TX_WR_CIPHER_V(x) ((x) << KEYCTX_TX_WR_CIPHER_S) |
---|
97 | | -#define KEYCTX_TX_WR_CIPHER_G(x) \ |
---|
98 | | - (((x) >> KEYCTX_TX_WR_CIPHER_S) & KEYCTX_TX_WR_CIPHER_M) |
---|
99 | | - |
---|
100 | | -#define KEYCTX_TX_WR_CIPHERST_S 23 |
---|
101 | | -#define KEYCTX_TX_WR_CIPHERST_M 0x7f |
---|
102 | | -#define KEYCTX_TX_WR_CIPHERST_V(x) ((x) << KEYCTX_TX_WR_CIPHERST_S) |
---|
103 | | -#define KEYCTX_TX_WR_CIPHERST_G(x) \ |
---|
104 | | - (((x) >> KEYCTX_TX_WR_CIPHERST_S) & KEYCTX_TX_WR_CIPHERST_M) |
---|
105 | | - |
---|
106 | | -#define KEYCTX_TX_WR_AUTH_S 14 |
---|
107 | | -#define KEYCTX_TX_WR_AUTH_M 0x1ff |
---|
108 | | -#define KEYCTX_TX_WR_AUTH_V(x) ((x) << KEYCTX_TX_WR_AUTH_S) |
---|
109 | | -#define KEYCTX_TX_WR_AUTH_G(x) \ |
---|
110 | | - (((x) >> KEYCTX_TX_WR_AUTH_S) & KEYCTX_TX_WR_AUTH_M) |
---|
111 | | - |
---|
112 | | -#define KEYCTX_TX_WR_AUTHST_S 7 |
---|
113 | | -#define KEYCTX_TX_WR_AUTHST_M 0x7f |
---|
114 | | -#define KEYCTX_TX_WR_AUTHST_V(x) ((x) << KEYCTX_TX_WR_AUTHST_S) |
---|
115 | | -#define KEYCTX_TX_WR_AUTHST_G(x) \ |
---|
116 | | - (((x) >> KEYCTX_TX_WR_AUTHST_S) & KEYCTX_TX_WR_AUTHST_M) |
---|
117 | | - |
---|
118 | | -#define KEYCTX_TX_WR_AUTHIN_S 0 |
---|
119 | | -#define KEYCTX_TX_WR_AUTHIN_M 0x7f |
---|
120 | | -#define KEYCTX_TX_WR_AUTHIN_V(x) ((x) << KEYCTX_TX_WR_AUTHIN_S) |
---|
121 | | -#define KEYCTX_TX_WR_AUTHIN_G(x) \ |
---|
122 | | - (((x) >> KEYCTX_TX_WR_AUTHIN_S) & KEYCTX_TX_WR_AUTHIN_M) |
---|
123 | | - |
---|
| 84 | +enum chcr_state { |
---|
| 85 | + CHCR_INIT = 0, |
---|
| 86 | + CHCR_ATTACH, |
---|
| 87 | + CHCR_DETACH, |
---|
| 88 | +}; |
---|
124 | 89 | struct chcr_wr { |
---|
125 | 90 | struct fw_crypto_lookaside_wr wreq; |
---|
126 | 91 | struct ulp_txpkt ulptx; |
---|
.. | .. |
---|
131 | 96 | |
---|
132 | 97 | struct chcr_dev { |
---|
133 | 98 | spinlock_t lock_chcr_dev; |
---|
134 | | - struct uld_ctx *u_ctx; |
---|
135 | | - unsigned char tx_channel_id; |
---|
136 | | - unsigned char rx_channel_id; |
---|
| 99 | + enum chcr_state state; |
---|
| 100 | + atomic_t inflight; |
---|
| 101 | + int wqretry; |
---|
| 102 | + struct delayed_work detach_work; |
---|
| 103 | + struct completion detach_comp; |
---|
137 | 104 | }; |
---|
138 | 105 | |
---|
139 | 106 | struct uld_ctx { |
---|
140 | 107 | struct list_head entry; |
---|
141 | 108 | struct cxgb4_lld_info lldi; |
---|
142 | | - struct chcr_dev *dev; |
---|
143 | | -}; |
---|
144 | | - |
---|
145 | | -struct sge_opaque_hdr { |
---|
146 | | - void *dev; |
---|
147 | | - dma_addr_t addr[MAX_SKB_FRAGS + 1]; |
---|
148 | | -}; |
---|
149 | | - |
---|
150 | | -struct chcr_ipsec_req { |
---|
151 | | - struct ulp_txpkt ulptx; |
---|
152 | | - struct ulptx_idata sc_imm; |
---|
153 | | - struct cpl_tx_sec_pdu sec_cpl; |
---|
154 | | - struct _key_ctx key_ctx; |
---|
155 | | -}; |
---|
156 | | - |
---|
157 | | -struct chcr_ipsec_wr { |
---|
158 | | - struct fw_ulptx_wr wreq; |
---|
159 | | - struct chcr_ipsec_req req; |
---|
160 | | -}; |
---|
161 | | - |
---|
162 | | -struct ipsec_sa_entry { |
---|
163 | | - int hmac_ctrl; |
---|
164 | | - unsigned int enckey_len; |
---|
165 | | - unsigned int kctx_len; |
---|
166 | | - unsigned int authsize; |
---|
167 | | - __be32 key_ctx_hdr; |
---|
168 | | - char salt[MAX_SALT]; |
---|
169 | | - char key[2 * AES_MAX_KEY_SIZE]; |
---|
| 109 | + struct chcr_dev dev; |
---|
170 | 110 | }; |
---|
171 | 111 | |
---|
172 | 112 | /* |
---|
.. | .. |
---|
181 | 121 | return (3 * n) / 2 + (n & 1) + 2; |
---|
182 | 122 | } |
---|
183 | 123 | |
---|
| 124 | +static inline void *padap(struct chcr_dev *dev) |
---|
| 125 | +{ |
---|
| 126 | + struct uld_ctx *u_ctx = container_of(dev, struct uld_ctx, dev); |
---|
| 127 | + |
---|
| 128 | + return pci_get_drvdata(u_ctx->lldi.pdev); |
---|
| 129 | +} |
---|
| 130 | + |
---|
184 | 131 | struct uld_ctx *assign_chcr_device(void); |
---|
185 | 132 | int chcr_send_wr(struct sk_buff *skb); |
---|
186 | 133 | int start_crypto(void); |
---|
.. | .. |
---|
190 | 137 | int chcr_uld_tx_handler(struct sk_buff *skb, struct net_device *dev); |
---|
191 | 138 | int chcr_handle_resp(struct crypto_async_request *req, unsigned char *input, |
---|
192 | 139 | int err); |
---|
193 | | -int chcr_ipsec_xmit(struct sk_buff *skb, struct net_device *dev); |
---|
194 | | -void chcr_add_xfrmops(const struct cxgb4_lld_info *lld); |
---|
195 | 140 | #endif /* __CHCR_CORE_H__ */ |
---|