X-Git-Url: http://rtime.felk.cvut.cz/gitweb/socketcan-devel.git/blobdiff_plain/3e4350c1649adfabd198c201d7a1ead9b2199fd3..55b7bae29a3225bf5922d8d7ce3e2ff467650f05:/kernel/2.6/net/can/bcm-prior-2-6-22.c diff --git a/kernel/2.6/net/can/bcm-prior-2-6-22.c b/kernel/2.6/net/can/bcm-prior-2-6-22.c index 062b2f3..1254675 100644 --- a/kernel/2.6/net/can/bcm-prior-2-6-22.c +++ b/kernel/2.6/net/can/bcm-prior-2-6-22.c @@ -52,13 +52,13 @@ #include #include #include -#include -#include -#include +#include +#include +#include #include #include "compat.h" -#include /* for RCSID. Removed by mkpatch script */ +#include /* for RCSID. Removed by mkpatch script */ RCSID("$Id$"); /* use of last_frames[index].can_dlc */ @@ -78,6 +78,7 @@ static __initdata const char banner[] = KERN_INFO MODULE_DESCRIPTION("PF_CAN broadcast manager protocol"); MODULE_LICENSE("Dual BSD/GPL"); MODULE_AUTHOR("Oliver Hartkopp "); +MODULE_ALIAS("can-proto-2"); #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22) #error This code only supports Kernel versions _below_ 2.6.22 @@ -415,9 +416,6 @@ static void bcm_tx_timeout_handler(unsigned long data) bcm_send_to_user(op, &msg_head, NULL, 0); } - } - - if (op->j_ival1 && (op->count > 0)) { /* send (next) frame */ bcm_can_tx(op); @@ -957,15 +955,19 @@ static int bcm_tx_setup(struct bcm_msg_head *msg_head, struct msghdr *msg, /* spec: send can_frame when starting timer */ op->flags |= TX_ANNOUNCE; - if (op->j_ival1 && (op->count > 0)) { + /* only start timer when having more frames than sent below */ + if (op->j_ival1 && (op->count > 1)) { /* op->count-- is done in bcm_tx_timeout_handler */ mod_timer(&op->timer, jiffies + op->j_ival1); } else mod_timer(&op->timer, jiffies + op->j_ival2); } - if (op->flags & TX_ANNOUNCE) + if (op->flags & TX_ANNOUNCE) { bcm_can_tx(op); + if (op->j_ival1 && (op->count > 0)) + op->count--; + } return msg_head->nframes * CFSIZ + MHSIZ; } @@ -1455,6 +1457,9 @@ static int bcm_release(struct socket *sock) bo->ifindex = 0; } + sock_orphan(sk); + sock->sk = NULL; + release_sock(sk); sock_put(sk); @@ -1541,7 +1546,7 @@ static int bcm_recvmsg(struct kiocb *iocb, struct socket *sock, return size; } -static struct proto_ops bcm_ops __read_mostly = { +static const struct proto_ops bcm_ops = { .family = PF_CAN, .release = bcm_release, .bind = sock_no_bind, @@ -1550,7 +1555,7 @@ static struct proto_ops bcm_ops __read_mostly = { .accept = sock_no_accept, .getname = sock_no_getname, .poll = datagram_poll, - .ioctl = NULL, /* use can_ioctl() from af_can.c */ + .ioctl = can_ioctl, /* use can_ioctl() from af_can.c */ .listen = sock_no_listen, .shutdown = sock_no_shutdown, .setsockopt = sock_no_setsockopt, @@ -1569,7 +1574,7 @@ static struct proto bcm_proto __read_mostly = { .init = bcm_init, }; -static struct can_proto bcm_can_proto __read_mostly = { +static const struct can_proto bcm_can_proto = { .type = SOCK_DGRAM, .protocol = CAN_BCM, .capability = -1, @@ -1577,7 +1582,7 @@ static struct can_proto bcm_can_proto __read_mostly = { .prot = &bcm_proto, }; #else -static struct can_proto bcm_can_proto __read_mostly = { +static const struct can_proto bcm_can_proto = { .type = SOCK_DGRAM, .protocol = CAN_BCM, .capability = -1,