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:
parent
3377f29bc5
commit
28f11244c3
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue