#define N_ELMCAN 29
#endif
+#define ELM327_SIZE_RXBUF 256
+#define ELM327_SIZE_TXBUF 32
+
#define ELM327_CAN_CONFIG_SEND_SFF 0x8000
#define ELM327_CAN_CONFIG_VARIABLE_DLC 0x4000
#define ELM327_CAN_CONFIG_RECV_BOTH_SFF_EFF 0x2000
/* TTY TX helpers */
struct work_struct tx_work; /* Flushes TTY TX buffer */
- unsigned char txbuf[32];
+ unsigned char *txbuf;
unsigned char *txhead; /* Pointer to next TX byte */
int txleft; /* Bytes left to TX */
/* TTY RX helpers */
- unsigned char rxbuf[256];
+ unsigned char *rxbuf;
int rxfill;
/* State machine */
static void elm327_drop_bytes(struct elmcan *elm, int i)
{
- memmove(&elm->rxbuf[0], &elm->rxbuf[i], sizeof(elm->rxbuf) - i);
+ memmove(&elm->rxbuf[0], &elm->rxbuf[i], ELM327_SIZE_RXBUF - i);
elm->rxfill -= i;
}
/* empty loop */
}
- if (len == sizeof(elm->rxbuf)) {
+ if (len == ELM327_SIZE_RXBUF) {
/* Line exceeds buffer. It's probably all garbage.
* Did we even connect at the right baud rate?
*/
goto out;
}
- while (count-- && elm->rxfill < sizeof(elm->rxbuf)) {
+ while (count-- && elm->rxfill < ELM327_SIZE_RXBUF) {
if (fp && *fp++) {
netdev_err(elm->dev, "Error in received character stream. Check your wiring.");
return -ENFILE;
elm = netdev_priv(dev);
+ elm->rxbuf = kmalloc(ELM327_SIZE_RXBUF, GFP_KERNEL);
+ elm->txbuf = kmalloc(ELM327_SIZE_TXBUF, GFP_KERNEL);
+ if (!elm->rxbuf || !elm->txbuf) {
+ err = -ENOMEM;
+ goto out_err;
+ }
+
/* Configure TTY interface */
tty->receive_room = 65536; /* We don't flow control */
elm->txleft = 0; /* Clear TTY TX buffer */
/* Let 'er rip */
err = register_candev(elm->dev);
- if (err) {
- free_candev(elm->dev);
- return err;
- }
+ if (err)
+ goto out_err;
netdev_info(elm->dev, "elmcan on %s.\n", tty->name);
return 0;
+
+out_err:
+ if (elm->txbuf)
+ kfree(elm->txbuf);
+ if (elm->rxbuf)
+ kfree(elm->rxbuf);
+ free_candev(elm->dev);
+ return err;
}
/* Close down an elmcan channel.
netdev_info(elm->dev, "elmcan off %s.\n", tty->name);
+ kfree(elm->txbuf);
+ kfree(elm->rxbuf);
free_candev(elm->dev);
}