#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 */
- /************************************************************************
- * ELM327: Transmission *
- * *
- * (all functions assume elm->lock taken) *
- ************************************************************************/
+ /***********************************************************************
+ * ELM327: Transmission *
+ * *
+ * (all functions assume elm->lock taken) *
+ ***********************************************************************/
static void elm327_send(struct elmcan *elm, const void *buf, size_t len)
{
- /************************************************************************
- * ELM327: Initialization sequence *
- * *
- * (assumes elm->lock taken) *
- ************************************************************************/
+ /***********************************************************************
+ * ELM327: Initialization sequence *
+ * *
+ * (assumes elm->lock taken) *
+ ***********************************************************************/
static char *elm327_init_script[] = {
"AT WS\r", /* v1.0: Warm Start */
- /************************************************************************
- * ELM327: Reception -> netdev glue *
- * *
- * (assumes elm->lock taken) *
- ************************************************************************/
+ /***********************************************************************
+ * ELM327: Reception -> netdev glue *
+ * *
+ * (assumes elm->lock taken) *
+ ***********************************************************************/
static void elm327_feed_frame_to_netdev(struct elmcan *elm,
const struct can_frame *frame)
- /************************************************************************
- * ELM327: "Panic" handler *
- * *
- * (assumes elm->lock taken) *
- ************************************************************************/
+ /***********************************************************************
+ * ELM327: "Panic" handler *
+ * *
+ * (assumes elm->lock taken) *
+ ***********************************************************************/
/* Called when we're out of ideas and just want it all to end. */
static inline void elm327_hw_failure(struct elmcan *elm)
- /************************************************************************
- * ELM327: Reception parser *
- * *
- * (assumes elm->lock taken) *
- ************************************************************************/
+ /***********************************************************************
+ * ELM327: Reception parser *
+ * *
+ * (assumes elm->lock taken) *
+ ***********************************************************************/
static void elm327_parse_error(struct elmcan *elm, int len)
{
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?
*/
- /************************************************************************
- * netdev *
- * *
- * (takes elm->lock) *
- ************************************************************************/
+ /***********************************************************************
+ * netdev *
+ * *
+ * (takes elm->lock) *
+ ***********************************************************************/
static int elmcan_netdev_open(struct net_device *dev)
{
- /************************************************************************
- * Line discipline *
- * *
- * (takes elm->lock) *
- ************************************************************************/
+ /***********************************************************************
+ * Line discipline *
+ * *
+ * (takes elm->lock) *
+ ***********************************************************************/
/* Get a reference to our struct, taking into account locks/refcounts.
* This is to ensure ordering in case we are shutting down, and to ensure
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.");
/* Dummy needed to use bitrate_const */
static int elmcan_do_set_bittiming(struct net_device *netdev)
{
+ (void)netdev;
+
return 0;
}
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);
}