// SPDX-License-Identifier: GPL-2.0 #include <linux/gfp.h> #include <linux/workqueue.h> #include <crypto/internal/skcipher.h> #include "nitrox_common.h" #include "nitrox_dev.h" #include "nitrox_req.h" #include "nitrox_csr.h" /* SLC_STORE_INFO */ #define MIN_UDD_LEN … /* PKT_IN_HDR + SLC_STORE_INFO */ #define FDATA_SIZE … /* Base destination port for the solicited requests */ #define SOLICIT_BASE_DPORT … #define REQ_NOT_POSTED … #define REQ_BACKLOG … #define REQ_POSTED … /* * Response codes from SE microcode * 0x00 - Success * Completion with no error * 0x43 - ERR_GC_DATA_LEN_INVALID * Invalid Data length if Encryption Data length is * less than 16 bytes for AES-XTS and AES-CTS. * 0x45 - ERR_GC_CTX_LEN_INVALID * Invalid context length: CTXL != 23 words. * 0x4F - ERR_GC_DOCSIS_CIPHER_INVALID * DOCSIS support is enabled with other than * AES/DES-CBC mode encryption. * 0x50 - ERR_GC_DOCSIS_OFFSET_INVALID * Authentication offset is other than 0 with * Encryption IV source = 0. * Authentication offset is other than 8 (DES)/16 (AES) * with Encryption IV source = 1 * 0x51 - ERR_GC_CRC32_INVALID_SELECTION * CRC32 is enabled for other than DOCSIS encryption. * 0x52 - ERR_GC_AES_CCM_FLAG_INVALID * Invalid flag options in AES-CCM IV. */ static inline int incr_index(int index, int count, int max) { … } static void softreq_unmap_sgbufs(struct nitrox_softreq *sr) { … } static void softreq_destroy(struct nitrox_softreq *sr) { … } /** * create_sg_component - create SG componets for N5 device. * @sr: Request structure * @sgtbl: SG table * @map_nents: number of dma mapped entries * * Component structure * * 63 48 47 32 31 16 15 0 * -------------------------------------- * | LEN0 | LEN1 | LEN2 | LEN3 | * |------------------------------------- * | PTR0 | * -------------------------------------- * | PTR1 | * -------------------------------------- * | PTR2 | * -------------------------------------- * | PTR3 | * -------------------------------------- * * Returns 0 if success or a negative errno code on error. */ static int create_sg_component(struct nitrox_softreq *sr, struct nitrox_sgtable *sgtbl, int map_nents) { … } /** * dma_map_inbufs - DMA map input sglist and creates sglist component * for N5 device. * @sr: Request structure * @req: Crypto request structre * * Returns 0 if successful or a negative errno code on error. */ static int dma_map_inbufs(struct nitrox_softreq *sr, struct se_crypto_request *req) { … } static int dma_map_outbufs(struct nitrox_softreq *sr, struct se_crypto_request *req) { … } static inline int softreq_map_iobuf(struct nitrox_softreq *sr, struct se_crypto_request *creq) { … } static inline void backlog_list_add(struct nitrox_softreq *sr, struct nitrox_cmdq *cmdq) { … } static inline void response_list_add(struct nitrox_softreq *sr, struct nitrox_cmdq *cmdq) { … } static inline void response_list_del(struct nitrox_softreq *sr, struct nitrox_cmdq *cmdq) { … } static struct nitrox_softreq * get_first_response_entry(struct nitrox_cmdq *cmdq) { … } static inline bool cmdq_full(struct nitrox_cmdq *cmdq, int qlen) { … } /** * post_se_instr - Post SE instruction to Packet Input ring * @sr: Request structure * @cmdq: Command queue structure * * Returns 0 if successful or a negative error code, * if no space in ring. */ static void post_se_instr(struct nitrox_softreq *sr, struct nitrox_cmdq *cmdq) { … } static int post_backlog_cmds(struct nitrox_cmdq *cmdq) { … } static int nitrox_enqueue_request(struct nitrox_softreq *sr) { … } /** * nitrox_process_se_request - Send request to SE core * @ndev: NITROX device * @req: Crypto request * @callback: Completion callback * @cb_arg: Completion callback arguments * * Returns 0 on success, or a negative error code. */ int nitrox_process_se_request(struct nitrox_device *ndev, struct se_crypto_request *req, completion_t callback, void *cb_arg) { … } static inline int cmd_timeout(unsigned long tstamp, unsigned long timeout) { … } void backlog_qflush_work(struct work_struct *work) { … } static bool sr_completed(struct nitrox_softreq *sr) { … } /** * process_response_list - process completed requests * @cmdq: Command queue structure * * Returns the number of responses processed. */ static void process_response_list(struct nitrox_cmdq *cmdq) { … } /* * pkt_slc_resp_tasklet - post processing of SE responses */ void pkt_slc_resp_tasklet(unsigned long data) { … }