• Home
  • Raw
  • Download

Lines Matching refs:mbx

149 static u16 fm10k_mbx_index_len(struct fm10k_mbx_info *mbx, u16 head, u16 tail)  in fm10k_mbx_index_len()  argument
157 return len & ((mbx->mbmem_len << 1) - 1); in fm10k_mbx_index_len()
168 static u16 fm10k_mbx_tail_add(struct fm10k_mbx_info *mbx, u16 offset) in fm10k_mbx_tail_add() argument
170 u16 tail = (mbx->tail + offset + 1) & ((mbx->mbmem_len << 1) - 1); in fm10k_mbx_tail_add()
173 return (tail > mbx->tail) ? --tail : ++tail; in fm10k_mbx_tail_add()
184 static u16 fm10k_mbx_tail_sub(struct fm10k_mbx_info *mbx, u16 offset) in fm10k_mbx_tail_sub() argument
186 u16 tail = (mbx->tail - offset - 1) & ((mbx->mbmem_len << 1) - 1); in fm10k_mbx_tail_sub()
189 return (tail < mbx->tail) ? ++tail : --tail; in fm10k_mbx_tail_sub()
200 static u16 fm10k_mbx_head_add(struct fm10k_mbx_info *mbx, u16 offset) in fm10k_mbx_head_add() argument
202 u16 head = (mbx->head + offset + 1) & ((mbx->mbmem_len << 1) - 1); in fm10k_mbx_head_add()
205 return (head > mbx->head) ? --head : ++head; in fm10k_mbx_head_add()
216 static u16 fm10k_mbx_head_sub(struct fm10k_mbx_info *mbx, u16 offset) in fm10k_mbx_head_sub() argument
218 u16 head = (mbx->head - offset - 1) & ((mbx->mbmem_len << 1) - 1); in fm10k_mbx_head_sub()
221 return (head < mbx->head) ? ++head : --head; in fm10k_mbx_head_sub()
231 static u16 fm10k_mbx_pushed_tail_len(struct fm10k_mbx_info *mbx) in fm10k_mbx_pushed_tail_len() argument
233 u32 *tail = mbx->rx.buffer + fm10k_fifo_tail_offset(&mbx->rx, 0); in fm10k_mbx_pushed_tail_len()
236 if (!mbx->pushed) in fm10k_mbx_pushed_tail_len()
313 static u16 fm10k_mbx_validate_msg_size(struct fm10k_mbx_info *mbx, u16 len) in fm10k_mbx_validate_msg_size() argument
315 struct fm10k_mbx_fifo *fifo = &mbx->rx; in fm10k_mbx_validate_msg_size()
320 len += mbx->pushed; in fm10k_mbx_validate_msg_size()
330 if ((len < total_len) && (msg_len <= mbx->max_size)) in fm10k_mbx_validate_msg_size()
347 struct fm10k_mbx_info *mbx) in fm10k_mbx_write_copy() argument
349 struct fm10k_mbx_fifo *fifo = &mbx->tx; in fm10k_mbx_write_copy()
350 u32 mbmem = mbx->mbmem_reg; in fm10k_mbx_write_copy()
354 if (!mbx->tail_len) in fm10k_mbx_write_copy()
358 mask = mbx->mbmem_len - 1; in fm10k_mbx_write_copy()
359 len = mbx->tail_len; in fm10k_mbx_write_copy()
360 tail = fm10k_mbx_tail_sub(mbx, len); in fm10k_mbx_write_copy()
365 end = fm10k_fifo_head_offset(fifo, mbx->pulled); in fm10k_mbx_write_copy()
379 mbx->tx_mbmem_pulled++; in fm10k_mbx_write_copy()
399 struct fm10k_mbx_info *mbx, u16 head) in fm10k_mbx_pull_head() argument
401 u16 mbmem_len, len, ack = fm10k_mbx_index_len(mbx, head, mbx->tail); in fm10k_mbx_pull_head()
402 struct fm10k_mbx_fifo *fifo = &mbx->tx; in fm10k_mbx_pull_head()
405 mbx->pulled += mbx->tail_len - ack; in fm10k_mbx_pull_head()
408 mbmem_len = mbx->mbmem_len - 1; in fm10k_mbx_pull_head()
409 len = fm10k_fifo_used(fifo) - mbx->pulled; in fm10k_mbx_pull_head()
414 mbx->tail = fm10k_mbx_tail_add(mbx, len - ack); in fm10k_mbx_pull_head()
415 mbx->tail_len = len; in fm10k_mbx_pull_head()
419 len && (mbx->pulled >= len); in fm10k_mbx_pull_head()
421 mbx->pulled -= fm10k_fifo_head_drop(fifo); in fm10k_mbx_pull_head()
422 mbx->tx_messages++; in fm10k_mbx_pull_head()
423 mbx->tx_dwords += len; in fm10k_mbx_pull_head()
427 fm10k_mbx_write_copy(hw, mbx); in fm10k_mbx_pull_head()
440 struct fm10k_mbx_info *mbx) in fm10k_mbx_read_copy() argument
442 struct fm10k_mbx_fifo *fifo = &mbx->rx; in fm10k_mbx_read_copy()
443 u32 mbmem = mbx->mbmem_reg ^ mbx->mbmem_len; in fm10k_mbx_read_copy()
448 len = mbx->head_len; in fm10k_mbx_read_copy()
449 head = fm10k_mbx_head_sub(mbx, len); in fm10k_mbx_read_copy()
450 if (head >= mbx->mbmem_len) in fm10k_mbx_read_copy()
454 end = fm10k_fifo_tail_offset(fifo, mbx->pushed); in fm10k_mbx_read_copy()
461 head &= mbx->mbmem_len - 1; in fm10k_mbx_read_copy()
465 mbx->rx_mbmem_pushed++; in fm10k_mbx_read_copy()
488 struct fm10k_mbx_info *mbx, in fm10k_mbx_push_tail() argument
491 struct fm10k_mbx_fifo *fifo = &mbx->rx; in fm10k_mbx_push_tail()
492 u16 len, seq = fm10k_mbx_index_len(mbx, mbx->head, tail); in fm10k_mbx_push_tail()
495 len = fm10k_fifo_unused(fifo) - mbx->pushed; in fm10k_mbx_push_tail()
500 mbx->head = fm10k_mbx_head_add(mbx, len); in fm10k_mbx_push_tail()
501 mbx->head_len = len; in fm10k_mbx_push_tail()
508 fm10k_mbx_read_copy(hw, mbx); in fm10k_mbx_push_tail()
511 if (fm10k_mbx_validate_msg_size(mbx, len)) in fm10k_mbx_push_tail()
515 mbx->pushed += len; in fm10k_mbx_push_tail()
518 for (len = fm10k_mbx_pushed_tail_len(mbx); in fm10k_mbx_push_tail()
519 len && (mbx->pushed >= len); in fm10k_mbx_push_tail()
520 len = fm10k_mbx_pushed_tail_len(mbx)) { in fm10k_mbx_push_tail()
522 mbx->pushed -= len; in fm10k_mbx_push_tail()
523 mbx->rx_messages++; in fm10k_mbx_push_tail()
524 mbx->rx_dwords += len; in fm10k_mbx_push_tail()
633 static void fm10k_mbx_update_local_crc(struct fm10k_mbx_info *mbx, u16 head) in fm10k_mbx_update_local_crc() argument
635 u16 len = mbx->tail_len - fm10k_mbx_index_len(mbx, head, mbx->tail); in fm10k_mbx_update_local_crc()
638 head = fm10k_fifo_head_offset(&mbx->tx, mbx->pulled); in fm10k_mbx_update_local_crc()
641 mbx->local = fm10k_fifo_crc(&mbx->tx, head, len, mbx->local); in fm10k_mbx_update_local_crc()
654 static s32 fm10k_mbx_verify_remote_crc(struct fm10k_mbx_info *mbx) in fm10k_mbx_verify_remote_crc() argument
656 struct fm10k_mbx_fifo *fifo = &mbx->rx; in fm10k_mbx_verify_remote_crc()
657 u16 len = mbx->head_len; in fm10k_mbx_verify_remote_crc()
658 u16 offset = fm10k_fifo_tail_offset(fifo, mbx->pushed) - len; in fm10k_mbx_verify_remote_crc()
663 mbx->remote = fm10k_fifo_crc(fifo, offset, len, mbx->remote); in fm10k_mbx_verify_remote_crc()
666 crc = fm10k_crc_16b(&mbx->mbx_hdr, mbx->remote, 1); in fm10k_mbx_verify_remote_crc()
678 static bool fm10k_mbx_rx_ready(struct fm10k_mbx_info *mbx) in fm10k_mbx_rx_ready() argument
680 u16 msg_size = fm10k_fifo_head_len(&mbx->rx); in fm10k_mbx_rx_ready()
682 return msg_size && (fm10k_fifo_used(&mbx->rx) >= msg_size); in fm10k_mbx_rx_ready()
692 static bool fm10k_mbx_tx_ready(struct fm10k_mbx_info *mbx, u16 len) in fm10k_mbx_tx_ready() argument
694 u16 fifo_unused = fm10k_fifo_unused(&mbx->tx); in fm10k_mbx_tx_ready()
696 return (mbx->state == FM10K_STATE_OPEN) && (fifo_unused >= len); in fm10k_mbx_tx_ready()
705 static bool fm10k_mbx_tx_complete(struct fm10k_mbx_info *mbx) in fm10k_mbx_tx_complete() argument
707 return fm10k_fifo_empty(&mbx->tx); in fm10k_mbx_tx_complete()
719 struct fm10k_mbx_info *mbx) in fm10k_mbx_dequeue_rx() argument
721 struct fm10k_mbx_fifo *fifo = &mbx->rx; in fm10k_mbx_dequeue_rx()
728 mbx, mbx->msg_data); in fm10k_mbx_dequeue_rx()
730 mbx->rx_parse_err++; in fm10k_mbx_dequeue_rx()
736 memmove(fifo->buffer, fifo->buffer + fifo->tail, mbx->pushed << 2); in fm10k_mbx_dequeue_rx()
756 struct fm10k_mbx_info *mbx, const u32 *msg) in fm10k_mbx_enqueue_tx() argument
758 u32 countdown = mbx->timeout; in fm10k_mbx_enqueue_tx()
761 switch (mbx->state) { in fm10k_mbx_enqueue_tx()
770 err = fm10k_fifo_enqueue(&mbx->tx, msg); in fm10k_mbx_enqueue_tx()
775 udelay(mbx->udelay); in fm10k_mbx_enqueue_tx()
776 mbx->ops.process(hw, mbx); in fm10k_mbx_enqueue_tx()
777 err = fm10k_fifo_enqueue(&mbx->tx, msg); in fm10k_mbx_enqueue_tx()
782 mbx->timeout = 0; in fm10k_mbx_enqueue_tx()
783 mbx->tx_busy++; in fm10k_mbx_enqueue_tx()
790 if (!mbx->tail_len) in fm10k_mbx_enqueue_tx()
791 mbx->ops.process(hw, mbx); in fm10k_mbx_enqueue_tx()
803 static s32 fm10k_mbx_read(struct fm10k_hw *hw, struct fm10k_mbx_info *mbx) in fm10k_mbx_read() argument
806 if (mbx->mbx_hdr) in fm10k_mbx_read()
810 if (fm10k_read_reg(hw, mbx->mbx_reg) & FM10K_MBX_REQ_INTERRUPT) in fm10k_mbx_read()
811 mbx->mbx_lock = FM10K_MBX_ACK; in fm10k_mbx_read()
814 fm10k_write_reg(hw, mbx->mbx_reg, in fm10k_mbx_read()
818 mbx->mbx_hdr = fm10k_read_reg(hw, mbx->mbmem_reg ^ mbx->mbmem_len); in fm10k_mbx_read()
830 static void fm10k_mbx_write(struct fm10k_hw *hw, struct fm10k_mbx_info *mbx) in fm10k_mbx_write() argument
832 u32 mbmem = mbx->mbmem_reg; in fm10k_mbx_write()
835 fm10k_write_reg(hw, mbmem, mbx->mbx_hdr); in fm10k_mbx_write()
838 if (mbx->mbx_lock) in fm10k_mbx_write()
839 fm10k_write_reg(hw, mbx->mbx_reg, mbx->mbx_lock); in fm10k_mbx_write()
842 mbx->mbx_hdr = 0; in fm10k_mbx_write()
843 mbx->mbx_lock = 0; in fm10k_mbx_write()
852 static void fm10k_mbx_create_connect_hdr(struct fm10k_mbx_info *mbx) in fm10k_mbx_create_connect_hdr() argument
854 mbx->mbx_lock |= FM10K_MBX_REQ; in fm10k_mbx_create_connect_hdr()
856 mbx->mbx_hdr = FM10K_MSG_HDR_FIELD_SET(FM10K_MSG_CONNECT, TYPE) | in fm10k_mbx_create_connect_hdr()
857 FM10K_MSG_HDR_FIELD_SET(mbx->head, HEAD) | in fm10k_mbx_create_connect_hdr()
858 FM10K_MSG_HDR_FIELD_SET(mbx->rx.size - 1, CONNECT_SIZE); in fm10k_mbx_create_connect_hdr()
867 static void fm10k_mbx_create_data_hdr(struct fm10k_mbx_info *mbx) in fm10k_mbx_create_data_hdr() argument
870 FM10K_MSG_HDR_FIELD_SET(mbx->tail, TAIL) | in fm10k_mbx_create_data_hdr()
871 FM10K_MSG_HDR_FIELD_SET(mbx->head, HEAD); in fm10k_mbx_create_data_hdr()
872 struct fm10k_mbx_fifo *fifo = &mbx->tx; in fm10k_mbx_create_data_hdr()
875 if (mbx->tail_len) in fm10k_mbx_create_data_hdr()
876 mbx->mbx_lock |= FM10K_MBX_REQ; in fm10k_mbx_create_data_hdr()
879 crc = fm10k_fifo_crc(fifo, fm10k_fifo_head_offset(fifo, mbx->pulled), in fm10k_mbx_create_data_hdr()
880 mbx->tail_len, mbx->local); in fm10k_mbx_create_data_hdr()
884 mbx->mbx_hdr = hdr | FM10K_MSG_HDR_FIELD_SET(crc, CRC); in fm10k_mbx_create_data_hdr()
893 static void fm10k_mbx_create_disconnect_hdr(struct fm10k_mbx_info *mbx) in fm10k_mbx_create_disconnect_hdr() argument
896 FM10K_MSG_HDR_FIELD_SET(mbx->tail, TAIL) | in fm10k_mbx_create_disconnect_hdr()
897 FM10K_MSG_HDR_FIELD_SET(mbx->head, HEAD); in fm10k_mbx_create_disconnect_hdr()
898 u16 crc = fm10k_crc_16b(&hdr, mbx->local, 1); in fm10k_mbx_create_disconnect_hdr()
900 mbx->mbx_lock |= FM10K_MBX_ACK; in fm10k_mbx_create_disconnect_hdr()
903 mbx->mbx_hdr = hdr | FM10K_MSG_HDR_FIELD_SET(crc, CRC); in fm10k_mbx_create_disconnect_hdr()
914 static void fm10k_mbx_create_fake_disconnect_hdr(struct fm10k_mbx_info *mbx) in fm10k_mbx_create_fake_disconnect_hdr() argument
917 FM10K_MSG_HDR_FIELD_SET(mbx->head, TAIL) | in fm10k_mbx_create_fake_disconnect_hdr()
918 FM10K_MSG_HDR_FIELD_SET(mbx->tail, HEAD); in fm10k_mbx_create_fake_disconnect_hdr()
919 u16 crc = fm10k_crc_16b(&hdr, mbx->local, 1); in fm10k_mbx_create_fake_disconnect_hdr()
921 mbx->mbx_lock |= FM10K_MBX_ACK; in fm10k_mbx_create_fake_disconnect_hdr()
924 mbx->mbx_hdr = hdr | FM10K_MSG_HDR_FIELD_SET(crc, CRC); in fm10k_mbx_create_fake_disconnect_hdr()
936 static void fm10k_mbx_create_error_msg(struct fm10k_mbx_info *mbx, s32 err) in fm10k_mbx_create_error_msg() argument
951 mbx->mbx_lock |= FM10K_MBX_REQ; in fm10k_mbx_create_error_msg()
953 mbx->mbx_hdr = FM10K_MSG_HDR_FIELD_SET(FM10K_MSG_ERROR, TYPE) | in fm10k_mbx_create_error_msg()
955 FM10K_MSG_HDR_FIELD_SET(mbx->head, HEAD); in fm10k_mbx_create_error_msg()
966 static s32 fm10k_mbx_validate_msg_hdr(struct fm10k_mbx_info *mbx) in fm10k_mbx_validate_msg_hdr() argument
969 const u32 *hdr = &mbx->mbx_hdr; in fm10k_mbx_validate_msg_hdr()
983 if (tail != mbx->head) in fm10k_mbx_validate_msg_hdr()
991 if (fm10k_mbx_index_len(mbx, head, mbx->tail) > mbx->tail_len) in fm10k_mbx_validate_msg_hdr()
997 if (fm10k_mbx_index_len(mbx, mbx->head, tail) < mbx->mbmem_len) in fm10k_mbx_validate_msg_hdr()
1034 struct fm10k_mbx_info *mbx, u16 head) in fm10k_mbx_create_reply() argument
1036 switch (mbx->state) { in fm10k_mbx_create_reply()
1040 fm10k_mbx_update_local_crc(mbx, head); in fm10k_mbx_create_reply()
1043 fm10k_mbx_pull_head(hw, mbx, head); in fm10k_mbx_create_reply()
1046 if (mbx->tail_len || (mbx->state == FM10K_STATE_OPEN)) in fm10k_mbx_create_reply()
1047 fm10k_mbx_create_data_hdr(mbx); in fm10k_mbx_create_reply()
1049 fm10k_mbx_create_disconnect_hdr(mbx); in fm10k_mbx_create_reply()
1053 fm10k_mbx_create_connect_hdr(mbx); in fm10k_mbx_create_reply()
1057 fm10k_mbx_create_disconnect_hdr(mbx); in fm10k_mbx_create_reply()
1073 static void fm10k_mbx_reset_work(struct fm10k_mbx_info *mbx) in fm10k_mbx_reset_work() argument
1078 mbx->max_size = mbx->rx.size - 1; in fm10k_mbx_reset_work()
1081 head = FM10K_MSG_HDR_FIELD_GET(mbx->mbx_hdr, HEAD); in fm10k_mbx_reset_work()
1082 ack = fm10k_mbx_index_len(mbx, head, mbx->tail); in fm10k_mbx_reset_work()
1083 mbx->pulled += mbx->tail_len - ack; in fm10k_mbx_reset_work()
1086 while (fm10k_fifo_head_len(&mbx->tx) && mbx->pulled) { in fm10k_mbx_reset_work()
1087 len = fm10k_fifo_head_drop(&mbx->tx); in fm10k_mbx_reset_work()
1088 mbx->tx_dropped++; in fm10k_mbx_reset_work()
1089 if (mbx->pulled >= len) in fm10k_mbx_reset_work()
1090 mbx->pulled -= len; in fm10k_mbx_reset_work()
1092 mbx->pulled = 0; in fm10k_mbx_reset_work()
1096 mbx->pushed = 0; in fm10k_mbx_reset_work()
1097 mbx->pulled = 0; in fm10k_mbx_reset_work()
1098 mbx->tail_len = 0; in fm10k_mbx_reset_work()
1099 mbx->head_len = 0; in fm10k_mbx_reset_work()
1100 mbx->rx.tail = 0; in fm10k_mbx_reset_work()
1101 mbx->rx.head = 0; in fm10k_mbx_reset_work()
1115 static void fm10k_mbx_update_max_size(struct fm10k_mbx_info *mbx, u16 size) in fm10k_mbx_update_max_size() argument
1119 mbx->max_size = size; in fm10k_mbx_update_max_size()
1122 for (len = fm10k_fifo_head_len(&mbx->tx); in fm10k_mbx_update_max_size()
1124 len = fm10k_fifo_head_len(&mbx->tx)) { in fm10k_mbx_update_max_size()
1125 fm10k_fifo_head_drop(&mbx->tx); in fm10k_mbx_update_max_size()
1126 mbx->tx_dropped++; in fm10k_mbx_update_max_size()
1137 static void fm10k_mbx_connect_reset(struct fm10k_mbx_info *mbx) in fm10k_mbx_connect_reset() argument
1140 fm10k_mbx_reset_work(mbx); in fm10k_mbx_connect_reset()
1143 mbx->local = FM10K_MBX_CRC_SEED; in fm10k_mbx_connect_reset()
1144 mbx->remote = FM10K_MBX_CRC_SEED; in fm10k_mbx_connect_reset()
1147 if (mbx->state == FM10K_STATE_OPEN) in fm10k_mbx_connect_reset()
1148 mbx->state = FM10K_STATE_CONNECT; in fm10k_mbx_connect_reset()
1150 mbx->state = FM10K_STATE_CLOSED; in fm10k_mbx_connect_reset()
1163 struct fm10k_mbx_info *mbx) in fm10k_mbx_process_connect() argument
1165 const enum fm10k_mbx_state state = mbx->state; in fm10k_mbx_process_connect()
1166 const u32 *hdr = &mbx->mbx_hdr; in fm10k_mbx_process_connect()
1177 fm10k_mbx_connect_reset(mbx); in fm10k_mbx_process_connect()
1181 if (size > mbx->rx.size) { in fm10k_mbx_process_connect()
1182 mbx->max_size = mbx->rx.size - 1; in fm10k_mbx_process_connect()
1185 mbx->state = FM10K_STATE_OPEN; in fm10k_mbx_process_connect()
1187 fm10k_mbx_update_max_size(mbx, size); in fm10k_mbx_process_connect()
1195 mbx->tail = head; in fm10k_mbx_process_connect()
1197 return fm10k_mbx_create_reply(hw, mbx, head); in fm10k_mbx_process_connect()
1210 struct fm10k_mbx_info *mbx) in fm10k_mbx_process_data() argument
1212 const u32 *hdr = &mbx->mbx_hdr; in fm10k_mbx_process_data()
1221 if (mbx->state == FM10K_STATE_CONNECT) { in fm10k_mbx_process_data()
1222 mbx->tail = head; in fm10k_mbx_process_data()
1223 mbx->state = FM10K_STATE_OPEN; in fm10k_mbx_process_data()
1227 err = fm10k_mbx_push_tail(hw, mbx, tail); in fm10k_mbx_process_data()
1232 err = fm10k_mbx_verify_remote_crc(mbx); in fm10k_mbx_process_data()
1237 fm10k_mbx_dequeue_rx(hw, mbx); in fm10k_mbx_process_data()
1239 return fm10k_mbx_create_reply(hw, mbx, head); in fm10k_mbx_process_data()
1252 struct fm10k_mbx_info *mbx) in fm10k_mbx_process_disconnect() argument
1254 const enum fm10k_mbx_state state = mbx->state; in fm10k_mbx_process_disconnect()
1255 const u32 *hdr = &mbx->mbx_hdr; in fm10k_mbx_process_disconnect()
1263 if (mbx->pushed) in fm10k_mbx_process_disconnect()
1267 mbx->head_len = 0; in fm10k_mbx_process_disconnect()
1270 err = fm10k_mbx_verify_remote_crc(mbx); in fm10k_mbx_process_disconnect()
1278 if (!fm10k_mbx_tx_complete(mbx)) in fm10k_mbx_process_disconnect()
1282 if (head != mbx->tail) in fm10k_mbx_process_disconnect()
1286 fm10k_mbx_connect_reset(mbx); in fm10k_mbx_process_disconnect()
1292 return fm10k_mbx_create_reply(hw, mbx, head); in fm10k_mbx_process_disconnect()
1305 struct fm10k_mbx_info *mbx) in fm10k_mbx_process_error() argument
1307 const u32 *hdr = &mbx->mbx_hdr; in fm10k_mbx_process_error()
1313 switch (mbx->state) { in fm10k_mbx_process_error()
1317 fm10k_mbx_reset_work(mbx); in fm10k_mbx_process_error()
1320 mbx->local = FM10K_MBX_CRC_SEED; in fm10k_mbx_process_error()
1321 mbx->remote = FM10K_MBX_CRC_SEED; in fm10k_mbx_process_error()
1324 mbx->tail = head; in fm10k_mbx_process_error()
1327 if (mbx->state == FM10K_STATE_OPEN) { in fm10k_mbx_process_error()
1328 mbx->state = FM10K_STATE_CONNECT; in fm10k_mbx_process_error()
1333 fm10k_mbx_create_connect_hdr(mbx); in fm10k_mbx_process_error()
1339 return fm10k_mbx_create_reply(hw, mbx, mbx->tail); in fm10k_mbx_process_error()
1352 struct fm10k_mbx_info *mbx) in fm10k_mbx_process() argument
1357 if (mbx->state == FM10K_STATE_CLOSED) in fm10k_mbx_process()
1361 err = fm10k_mbx_read(hw, mbx); in fm10k_mbx_process()
1366 err = fm10k_mbx_validate_msg_hdr(mbx); in fm10k_mbx_process()
1370 switch (FM10K_MSG_HDR_FIELD_GET(mbx->mbx_hdr, TYPE)) { in fm10k_mbx_process()
1372 err = fm10k_mbx_process_connect(hw, mbx); in fm10k_mbx_process()
1375 err = fm10k_mbx_process_data(hw, mbx); in fm10k_mbx_process()
1378 err = fm10k_mbx_process_disconnect(hw, mbx); in fm10k_mbx_process()
1381 err = fm10k_mbx_process_error(hw, mbx); in fm10k_mbx_process()
1391 fm10k_mbx_create_error_msg(mbx, err); in fm10k_mbx_process()
1394 fm10k_mbx_write(hw, mbx); in fm10k_mbx_process()
1413 struct fm10k_mbx_info *mbx) in fm10k_mbx_disconnect() argument
1415 int timeout = mbx->timeout ? FM10K_MBX_DISCONNECT_TIMEOUT : 0; in fm10k_mbx_disconnect()
1418 mbx->state = FM10K_STATE_DISCONNECT; in fm10k_mbx_disconnect()
1421 fm10k_write_reg(hw, mbx->mbx_reg, FM10K_MBX_REQ | in fm10k_mbx_disconnect()
1425 mbx->ops.process(hw, mbx); in fm10k_mbx_disconnect()
1427 } while ((timeout > 0) && (mbx->state != FM10K_STATE_CLOSED)); in fm10k_mbx_disconnect()
1432 fm10k_mbx_connect_reset(mbx); in fm10k_mbx_disconnect()
1433 fm10k_fifo_drop_all(&mbx->tx); in fm10k_mbx_disconnect()
1435 fm10k_write_reg(hw, mbx->mbmem_reg, 0); in fm10k_mbx_disconnect()
1451 static s32 fm10k_mbx_connect(struct fm10k_hw *hw, struct fm10k_mbx_info *mbx) in fm10k_mbx_connect() argument
1454 if (!mbx->rx.buffer) in fm10k_mbx_connect()
1458 if (mbx->state != FM10K_STATE_CLOSED) in fm10k_mbx_connect()
1462 mbx->timeout = FM10K_MBX_INIT_TIMEOUT; in fm10k_mbx_connect()
1465 mbx->state = FM10K_STATE_CONNECT; in fm10k_mbx_connect()
1467 fm10k_mbx_reset_work(mbx); in fm10k_mbx_connect()
1470 fm10k_mbx_create_fake_disconnect_hdr(mbx); in fm10k_mbx_connect()
1471 fm10k_write_reg(hw, mbx->mbmem_reg ^ mbx->mbmem_len, mbx->mbx_hdr); in fm10k_mbx_connect()
1474 mbx->mbx_lock = FM10K_MBX_REQ_INTERRUPT | FM10K_MBX_ACK_INTERRUPT | in fm10k_mbx_connect()
1478 fm10k_mbx_create_connect_hdr(mbx); in fm10k_mbx_connect()
1479 fm10k_mbx_write(hw, mbx); in fm10k_mbx_connect()
1546 static s32 fm10k_mbx_register_handlers(struct fm10k_mbx_info *mbx, in fm10k_mbx_register_handlers() argument
1554 mbx->msg_data = msg_data; in fm10k_mbx_register_handlers()
1573 s32 fm10k_pfvf_mbx_init(struct fm10k_hw *hw, struct fm10k_mbx_info *mbx, in fm10k_pfvf_mbx_init() argument
1579 mbx->mbx_reg = FM10K_VFMBX; in fm10k_pfvf_mbx_init()
1580 mbx->mbmem_reg = FM10K_VFMBMEM(FM10K_VFMBMEM_VF_XOR); in fm10k_pfvf_mbx_init()
1585 mbx->mbx_reg = FM10K_MBX(id); in fm10k_pfvf_mbx_init()
1586 mbx->mbmem_reg = FM10K_MBMEM_VF(id, 0); in fm10k_pfvf_mbx_init()
1595 mbx->state = FM10K_STATE_CLOSED; in fm10k_pfvf_mbx_init()
1602 mbx->msg_data = msg_data; in fm10k_pfvf_mbx_init()
1607 mbx->timeout = 0; in fm10k_pfvf_mbx_init()
1608 mbx->udelay = FM10K_MBX_INIT_DELAY; in fm10k_pfvf_mbx_init()
1611 mbx->tail = 1; in fm10k_pfvf_mbx_init()
1612 mbx->head = 1; in fm10k_pfvf_mbx_init()
1615 mbx->local = FM10K_MBX_CRC_SEED; in fm10k_pfvf_mbx_init()
1616 mbx->remote = FM10K_MBX_CRC_SEED; in fm10k_pfvf_mbx_init()
1619 mbx->max_size = FM10K_MBX_MSG_MAX_SIZE; in fm10k_pfvf_mbx_init()
1620 mbx->mbmem_len = FM10K_VFMBMEM_VF_XOR; in fm10k_pfvf_mbx_init()
1623 fm10k_fifo_init(&mbx->tx, mbx->buffer, FM10K_MBX_TX_BUFFER_SIZE); in fm10k_pfvf_mbx_init()
1624 fm10k_fifo_init(&mbx->rx, &mbx->buffer[FM10K_MBX_TX_BUFFER_SIZE], in fm10k_pfvf_mbx_init()
1628 mbx->ops.connect = fm10k_mbx_connect; in fm10k_pfvf_mbx_init()
1629 mbx->ops.disconnect = fm10k_mbx_disconnect; in fm10k_pfvf_mbx_init()
1630 mbx->ops.rx_ready = fm10k_mbx_rx_ready; in fm10k_pfvf_mbx_init()
1631 mbx->ops.tx_ready = fm10k_mbx_tx_ready; in fm10k_pfvf_mbx_init()
1632 mbx->ops.tx_complete = fm10k_mbx_tx_complete; in fm10k_pfvf_mbx_init()
1633 mbx->ops.enqueue_tx = fm10k_mbx_enqueue_tx; in fm10k_pfvf_mbx_init()
1634 mbx->ops.process = fm10k_mbx_process; in fm10k_pfvf_mbx_init()
1635 mbx->ops.register_handlers = fm10k_mbx_register_handlers; in fm10k_pfvf_mbx_init()
1646 static void fm10k_sm_mbx_create_data_hdr(struct fm10k_mbx_info *mbx) in fm10k_sm_mbx_create_data_hdr() argument
1648 if (mbx->tail_len) in fm10k_sm_mbx_create_data_hdr()
1649 mbx->mbx_lock |= FM10K_MBX_REQ; in fm10k_sm_mbx_create_data_hdr()
1651 mbx->mbx_hdr = FM10K_MSG_HDR_FIELD_SET(mbx->tail, SM_TAIL) | in fm10k_sm_mbx_create_data_hdr()
1652 FM10K_MSG_HDR_FIELD_SET(mbx->remote, SM_VER) | in fm10k_sm_mbx_create_data_hdr()
1653 FM10K_MSG_HDR_FIELD_SET(mbx->head, SM_HEAD); in fm10k_sm_mbx_create_data_hdr()
1663 static void fm10k_sm_mbx_create_connect_hdr(struct fm10k_mbx_info *mbx, u8 err) in fm10k_sm_mbx_create_connect_hdr() argument
1665 if (mbx->local) in fm10k_sm_mbx_create_connect_hdr()
1666 mbx->mbx_lock |= FM10K_MBX_REQ; in fm10k_sm_mbx_create_connect_hdr()
1668 mbx->mbx_hdr = FM10K_MSG_HDR_FIELD_SET(mbx->tail, SM_TAIL) | in fm10k_sm_mbx_create_connect_hdr()
1669 FM10K_MSG_HDR_FIELD_SET(mbx->remote, SM_VER) | in fm10k_sm_mbx_create_connect_hdr()
1670 FM10K_MSG_HDR_FIELD_SET(mbx->head, SM_HEAD) | in fm10k_sm_mbx_create_connect_hdr()
1680 static void fm10k_sm_mbx_connect_reset(struct fm10k_mbx_info *mbx) in fm10k_sm_mbx_connect_reset() argument
1683 fm10k_mbx_reset_work(mbx); in fm10k_sm_mbx_connect_reset()
1686 mbx->local = FM10K_SM_MBX_VERSION; in fm10k_sm_mbx_connect_reset()
1687 mbx->remote = 0; in fm10k_sm_mbx_connect_reset()
1690 mbx->tail = 1; in fm10k_sm_mbx_connect_reset()
1691 mbx->head = 1; in fm10k_sm_mbx_connect_reset()
1694 mbx->state = FM10K_STATE_CONNECT; in fm10k_sm_mbx_connect_reset()
1709 static s32 fm10k_sm_mbx_connect(struct fm10k_hw *hw, struct fm10k_mbx_info *mbx) in fm10k_sm_mbx_connect() argument
1712 if (!mbx->rx.buffer) in fm10k_sm_mbx_connect()
1716 if (mbx->state != FM10K_STATE_CLOSED) in fm10k_sm_mbx_connect()
1720 mbx->timeout = FM10K_MBX_INIT_TIMEOUT; in fm10k_sm_mbx_connect()
1723 mbx->state = FM10K_STATE_CONNECT; in fm10k_sm_mbx_connect()
1724 mbx->max_size = FM10K_MBX_MSG_MAX_SIZE; in fm10k_sm_mbx_connect()
1727 fm10k_sm_mbx_connect_reset(mbx); in fm10k_sm_mbx_connect()
1730 mbx->mbx_lock = FM10K_MBX_REQ_INTERRUPT | FM10K_MBX_ACK_INTERRUPT | in fm10k_sm_mbx_connect()
1734 fm10k_sm_mbx_create_connect_hdr(mbx, 0); in fm10k_sm_mbx_connect()
1735 fm10k_mbx_write(hw, mbx); in fm10k_sm_mbx_connect()
1754 struct fm10k_mbx_info *mbx) in fm10k_sm_mbx_disconnect() argument
1756 int timeout = mbx->timeout ? FM10K_MBX_DISCONNECT_TIMEOUT : 0; in fm10k_sm_mbx_disconnect()
1759 mbx->state = FM10K_STATE_DISCONNECT; in fm10k_sm_mbx_disconnect()
1762 fm10k_write_reg(hw, mbx->mbx_reg, FM10K_MBX_REQ | in fm10k_sm_mbx_disconnect()
1766 mbx->ops.process(hw, mbx); in fm10k_sm_mbx_disconnect()
1768 } while ((timeout > 0) && (mbx->state != FM10K_STATE_CLOSED)); in fm10k_sm_mbx_disconnect()
1771 mbx->state = FM10K_STATE_CLOSED; in fm10k_sm_mbx_disconnect()
1772 mbx->remote = 0; in fm10k_sm_mbx_disconnect()
1773 fm10k_mbx_reset_work(mbx); in fm10k_sm_mbx_disconnect()
1774 fm10k_fifo_drop_all(&mbx->tx); in fm10k_sm_mbx_disconnect()
1776 fm10k_write_reg(hw, mbx->mbmem_reg, 0); in fm10k_sm_mbx_disconnect()
1787 static s32 fm10k_sm_mbx_validate_fifo_hdr(struct fm10k_mbx_info *mbx) in fm10k_sm_mbx_validate_fifo_hdr() argument
1789 const u32 *hdr = &mbx->mbx_hdr; in fm10k_sm_mbx_validate_fifo_hdr()
1804 if (mbx->tail < head) in fm10k_sm_mbx_validate_fifo_hdr()
1805 head += mbx->mbmem_len - 1; in fm10k_sm_mbx_validate_fifo_hdr()
1806 if (tail < mbx->head) in fm10k_sm_mbx_validate_fifo_hdr()
1807 tail += mbx->mbmem_len - 1; in fm10k_sm_mbx_validate_fifo_hdr()
1808 if (fm10k_mbx_index_len(mbx, head, mbx->tail) > mbx->tail_len) in fm10k_sm_mbx_validate_fifo_hdr()
1810 if (fm10k_mbx_index_len(mbx, mbx->head, tail) < mbx->mbmem_len) in fm10k_sm_mbx_validate_fifo_hdr()
1829 static void fm10k_sm_mbx_process_error(struct fm10k_mbx_info *mbx) in fm10k_sm_mbx_process_error() argument
1831 const enum fm10k_mbx_state state = mbx->state; in fm10k_sm_mbx_process_error()
1836 mbx->remote = 0; in fm10k_sm_mbx_process_error()
1840 fm10k_sm_mbx_connect_reset(mbx); in fm10k_sm_mbx_process_error()
1844 if (mbx->remote) { in fm10k_sm_mbx_process_error()
1845 while (mbx->local > 1) in fm10k_sm_mbx_process_error()
1846 mbx->local--; in fm10k_sm_mbx_process_error()
1847 mbx->remote = 0; in fm10k_sm_mbx_process_error()
1854 fm10k_sm_mbx_create_connect_hdr(mbx, 0); in fm10k_sm_mbx_process_error()
1865 static void fm10k_sm_mbx_create_error_msg(struct fm10k_mbx_info *mbx, s32 err) in fm10k_sm_mbx_create_error_msg() argument
1880 fm10k_sm_mbx_process_error(mbx); in fm10k_sm_mbx_create_error_msg()
1881 fm10k_sm_mbx_create_connect_hdr(mbx, 1); in fm10k_sm_mbx_create_error_msg()
1894 struct fm10k_mbx_info *mbx, in fm10k_sm_mbx_receive() argument
1898 u16 mbmem_len = mbx->mbmem_len - 1; in fm10k_sm_mbx_receive()
1902 if (tail < mbx->head) in fm10k_sm_mbx_receive()
1906 err = fm10k_mbx_push_tail(hw, mbx, tail); in fm10k_sm_mbx_receive()
1911 fm10k_mbx_dequeue_rx(hw, mbx); in fm10k_sm_mbx_receive()
1914 mbx->head = fm10k_mbx_head_sub(mbx, mbx->pushed); in fm10k_sm_mbx_receive()
1915 mbx->pushed = 0; in fm10k_sm_mbx_receive()
1918 if (mbx->head > mbmem_len) in fm10k_sm_mbx_receive()
1919 mbx->head -= mbmem_len; in fm10k_sm_mbx_receive()
1934 struct fm10k_mbx_info *mbx, u16 head) in fm10k_sm_mbx_transmit() argument
1936 struct fm10k_mbx_fifo *fifo = &mbx->tx; in fm10k_sm_mbx_transmit()
1938 u16 mbmem_len = mbx->mbmem_len - 1; in fm10k_sm_mbx_transmit()
1943 if (mbx->tail < head) in fm10k_sm_mbx_transmit()
1946 fm10k_mbx_pull_head(hw, mbx, head); in fm10k_sm_mbx_transmit()
1953 } while ((len <= mbx->tail_len) && (len < mbmem_len)); in fm10k_sm_mbx_transmit()
1956 if (mbx->tail_len > tail_len) { in fm10k_sm_mbx_transmit()
1957 mbx->tail = fm10k_mbx_tail_sub(mbx, mbx->tail_len - tail_len); in fm10k_sm_mbx_transmit()
1958 mbx->tail_len = tail_len; in fm10k_sm_mbx_transmit()
1962 if (mbx->tail > mbmem_len) in fm10k_sm_mbx_transmit()
1963 mbx->tail -= mbmem_len; in fm10k_sm_mbx_transmit()
1978 struct fm10k_mbx_info *mbx, u16 head) in fm10k_sm_mbx_create_reply() argument
1980 switch (mbx->state) { in fm10k_sm_mbx_create_reply()
1984 fm10k_sm_mbx_transmit(hw, mbx, head); in fm10k_sm_mbx_create_reply()
1987 if (mbx->tail_len || (mbx->state == FM10K_STATE_OPEN)) { in fm10k_sm_mbx_create_reply()
1988 fm10k_sm_mbx_create_data_hdr(mbx); in fm10k_sm_mbx_create_reply()
1990 mbx->remote = 0; in fm10k_sm_mbx_create_reply()
1991 fm10k_sm_mbx_create_connect_hdr(mbx, 0); in fm10k_sm_mbx_create_reply()
1996 fm10k_sm_mbx_create_connect_hdr(mbx, 0); in fm10k_sm_mbx_create_reply()
2015 struct fm10k_mbx_info *mbx) in fm10k_sm_mbx_process_reset() argument
2018 const enum fm10k_mbx_state state = mbx->state; in fm10k_sm_mbx_process_reset()
2023 mbx->state = FM10K_STATE_CLOSED; in fm10k_sm_mbx_process_reset()
2024 mbx->remote = 0; in fm10k_sm_mbx_process_reset()
2025 mbx->local = 0; in fm10k_sm_mbx_process_reset()
2029 fm10k_sm_mbx_connect_reset(mbx); in fm10k_sm_mbx_process_reset()
2034 mbx->remote = mbx->local; in fm10k_sm_mbx_process_reset()
2039 fm10k_sm_mbx_create_reply(hw, mbx, mbx->tail); in fm10k_sm_mbx_process_reset()
2053 struct fm10k_mbx_info *mbx) in fm10k_sm_mbx_process_version_1() argument
2055 const u32 *hdr = &mbx->mbx_hdr; in fm10k_sm_mbx_process_version_1()
2064 if (mbx->state == FM10K_STATE_CONNECT) { in fm10k_sm_mbx_process_version_1()
2065 if (!mbx->remote) in fm10k_sm_mbx_process_version_1()
2067 if (mbx->remote != 1) in fm10k_sm_mbx_process_version_1()
2070 mbx->state = FM10K_STATE_OPEN; in fm10k_sm_mbx_process_version_1()
2075 len = fm10k_sm_mbx_receive(hw, mbx, tail); in fm10k_sm_mbx_process_version_1()
2083 fm10k_sm_mbx_create_reply(hw, mbx, head); in fm10k_sm_mbx_process_version_1()
2098 struct fm10k_mbx_info *mbx) in fm10k_sm_mbx_process() argument
2103 if (mbx->state == FM10K_STATE_CLOSED) in fm10k_sm_mbx_process()
2107 err = fm10k_mbx_read(hw, mbx); in fm10k_sm_mbx_process()
2111 err = fm10k_sm_mbx_validate_fifo_hdr(mbx); in fm10k_sm_mbx_process()
2115 if (FM10K_MSG_HDR_FIELD_GET(mbx->mbx_hdr, SM_ERR)) { in fm10k_sm_mbx_process()
2116 fm10k_sm_mbx_process_error(mbx); in fm10k_sm_mbx_process()
2120 switch (FM10K_MSG_HDR_FIELD_GET(mbx->mbx_hdr, SM_VER)) { in fm10k_sm_mbx_process()
2122 err = fm10k_sm_mbx_process_reset(hw, mbx); in fm10k_sm_mbx_process()
2125 err = fm10k_sm_mbx_process_version_1(hw, mbx); in fm10k_sm_mbx_process()
2131 fm10k_sm_mbx_create_error_msg(mbx, err); in fm10k_sm_mbx_process()
2134 fm10k_mbx_write(hw, mbx); in fm10k_sm_mbx_process()
2152 s32 fm10k_sm_mbx_init(struct fm10k_hw *hw, struct fm10k_mbx_info *mbx, in fm10k_sm_mbx_init() argument
2155 mbx->mbx_reg = FM10K_GMBX; in fm10k_sm_mbx_init()
2156 mbx->mbmem_reg = FM10K_MBMEM_PF(0); in fm10k_sm_mbx_init()
2159 mbx->state = FM10K_STATE_CLOSED; in fm10k_sm_mbx_init()
2166 mbx->msg_data = msg_data; in fm10k_sm_mbx_init()
2171 mbx->timeout = 0; in fm10k_sm_mbx_init()
2172 mbx->udelay = FM10K_MBX_INIT_DELAY; in fm10k_sm_mbx_init()
2175 mbx->max_size = FM10K_MBX_MSG_MAX_SIZE; in fm10k_sm_mbx_init()
2176 mbx->mbmem_len = FM10K_MBMEM_PF_XOR; in fm10k_sm_mbx_init()
2179 fm10k_fifo_init(&mbx->tx, mbx->buffer, FM10K_MBX_TX_BUFFER_SIZE); in fm10k_sm_mbx_init()
2180 fm10k_fifo_init(&mbx->rx, &mbx->buffer[FM10K_MBX_TX_BUFFER_SIZE], in fm10k_sm_mbx_init()
2184 mbx->ops.connect = fm10k_sm_mbx_connect; in fm10k_sm_mbx_init()
2185 mbx->ops.disconnect = fm10k_sm_mbx_disconnect; in fm10k_sm_mbx_init()
2186 mbx->ops.rx_ready = fm10k_mbx_rx_ready; in fm10k_sm_mbx_init()
2187 mbx->ops.tx_ready = fm10k_mbx_tx_ready; in fm10k_sm_mbx_init()
2188 mbx->ops.tx_complete = fm10k_mbx_tx_complete; in fm10k_sm_mbx_init()
2189 mbx->ops.enqueue_tx = fm10k_mbx_enqueue_tx; in fm10k_sm_mbx_init()
2190 mbx->ops.process = fm10k_sm_mbx_process; in fm10k_sm_mbx_init()
2191 mbx->ops.register_handlers = fm10k_mbx_register_handlers; in fm10k_sm_mbx_init()