usb_canbus: No need to check if canserial can accept a packet

The canserial code already advertizes a receive window, so the host
should never flood the canserial code.  Remove the extra scheduling
checks to simplify the usb_canbus code.

Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
This commit is contained in:
Kevin O'Connor 2023-04-15 12:21:46 -04:00
parent 3377f29bc5
commit 28f11244c3
3 changed files with 8 additions and 13 deletions

View File

@ -224,7 +224,7 @@ canserial_notify_rx(void)
DECL_CONSTANT("RECEIVE_WINDOW", ARRAY_SIZE(CanData.receive_buf)); DECL_CONSTANT("RECEIVE_WINDOW", ARRAY_SIZE(CanData.receive_buf));
// Handle incoming data (called from IRQ handler) // Handle incoming data (called from IRQ handler)
int void
canserial_process_data(struct canbus_msg *msg) canserial_process_data(struct canbus_msg *msg)
{ {
uint32_t id = msg->id; uint32_t id = msg->id;
@ -233,7 +233,7 @@ canserial_process_data(struct canbus_msg *msg)
int rpos = CanData.receive_pos; int rpos = CanData.receive_pos;
uint32_t len = CANMSG_DATA_LEN(msg); uint32_t len = CANMSG_DATA_LEN(msg);
if (len > sizeof(CanData.receive_buf) - rpos) if (len > sizeof(CanData.receive_buf) - rpos)
return -1; return;
memcpy(&CanData.receive_buf[rpos], msg->data, len); memcpy(&CanData.receive_buf[rpos], msg->data, len);
CanData.receive_pos = rpos + len; CanData.receive_pos = rpos + len;
canserial_notify_rx(); canserial_notify_rx();
@ -243,13 +243,12 @@ canserial_process_data(struct canbus_msg *msg)
uint32_t pushp = CanData.admin_push_pos; uint32_t pushp = CanData.admin_push_pos;
if (pushp >= CanData.admin_pull_pos + ARRAY_SIZE(CanData.admin_queue)) if (pushp >= CanData.admin_pull_pos + ARRAY_SIZE(CanData.admin_queue))
// No space - drop message // No space - drop message
return -1; return;
uint32_t pos = pushp % ARRAY_SIZE(CanData.admin_queue); uint32_t pos = pushp % ARRAY_SIZE(CanData.admin_queue);
memcpy(&CanData.admin_queue[pos], msg, sizeof(*msg)); memcpy(&CanData.admin_queue[pos], msg, sizeof(*msg));
CanData.admin_push_pos = pushp + 1; CanData.admin_push_pos = pushp + 1;
canserial_notify_rx(); canserial_notify_rx();
} }
return 0;
} }
// Remove from the receive buffer the given number of bytes // Remove from the receive buffer the given number of bytes

View File

@ -9,7 +9,7 @@
// canserial.c // canserial.c
void canserial_notify_tx(void); void canserial_notify_tx(void);
struct canbus_msg; struct canbus_msg;
int canserial_process_data(struct canbus_msg *msg); void canserial_process_data(struct canbus_msg *msg);
void canserial_set_uuid(uint8_t *raw_uuid, uint32_t raw_uuid_len); void canserial_set_uuid(uint8_t *raw_uuid, uint32_t raw_uuid_len);
#endif // canserial.h #endif // canserial.h

View File

@ -204,20 +204,16 @@ usbcan_task(void)
msg.dlc = gs->can_dlc; msg.dlc = gs->can_dlc;
msg.data32[0] = gs->data32[0]; msg.data32[0] = gs->data32[0];
msg.data32[1] = gs->data32[1]; msg.data32[1] = gs->data32[1];
if (host_status & HS_TX_LOCAL) {
canserial_process_data(&msg);
UsbCan.host_status = host_status = host_status & ~HS_TX_LOCAL;
}
if (host_status & HS_TX_HW) { if (host_status & HS_TX_HW) {
ret = canhw_send(&msg); ret = canhw_send(&msg);
if (ret < 0) if (ret < 0)
return; return;
UsbCan.host_status = host_status = host_status & ~HS_TX_HW; UsbCan.host_status = host_status = host_status & ~HS_TX_HW;
} }
if (host_status & HS_TX_LOCAL) {
ret = canserial_process_data(&msg);
if (ret < 0) {
usb_notify_bulk_out();
return;
}
UsbCan.host_status = host_status & ~HS_TX_LOCAL;
}
continue; continue;
} }