Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 170674
b: refs/heads/master
c: a6e4bc5
h: refs/heads/master
v: v3
  • Loading branch information
Wolfgang Grandegger authored and David S. Miller committed Oct 13, 2009
1 parent 996f5e8 commit 4dd0197
Show file tree
Hide file tree
Showing 8 changed files with 43 additions and 24 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 61321bbd6235ca9a40ba3bc249e8906cc66233c3
refs/heads/master: a6e4bc5304033e434fabccabb230b8e9ff55d76f
2 changes: 1 addition & 1 deletion trunk/drivers/net/can/at91_can.c
Original file line number Diff line number Diff line change
Expand Up @@ -1087,7 +1087,7 @@ static int __init at91_can_probe(struct platform_device *pdev)
goto exit_release;
}

dev = alloc_candev(sizeof(struct at91_priv));
dev = alloc_candev(sizeof(struct at91_priv), AT91_MB_TX_NUM);
if (!dev) {
err = -ENOMEM;
goto exit_iounmap;
Expand Down
32 changes: 26 additions & 6 deletions trunk/drivers/net/can/dev.c
Original file line number Diff line number Diff line change
Expand Up @@ -245,7 +245,7 @@ static void can_flush_echo_skb(struct net_device *dev)
struct net_device_stats *stats = &dev->stats;
int i;

for (i = 0; i < CAN_ECHO_SKB_MAX; i++) {
for (i = 0; i < priv->echo_skb_max; i++) {
if (priv->echo_skb[i]) {
kfree_skb(priv->echo_skb[i]);
priv->echo_skb[i] = NULL;
Expand All @@ -262,10 +262,13 @@ static void can_flush_echo_skb(struct net_device *dev)
* of the device driver. The driver must protect access to
* priv->echo_skb, if necessary.
*/
void can_put_echo_skb(struct sk_buff *skb, struct net_device *dev, int idx)
void can_put_echo_skb(struct sk_buff *skb, struct net_device *dev,
unsigned int idx)
{
struct can_priv *priv = netdev_priv(dev);

BUG_ON(idx >= priv->echo_skb_max);

/* check flag whether this packet has to be looped back */
if (!(dev->flags & IFF_ECHO) || skb->pkt_type != PACKET_LOOPBACK) {
kfree_skb(skb);
Expand Down Expand Up @@ -311,10 +314,12 @@ EXPORT_SYMBOL_GPL(can_put_echo_skb);
* is handled in the device driver. The driver must protect
* access to priv->echo_skb, if necessary.
*/
void can_get_echo_skb(struct net_device *dev, int idx)
void can_get_echo_skb(struct net_device *dev, unsigned int idx)
{
struct can_priv *priv = netdev_priv(dev);

BUG_ON(idx >= priv->echo_skb_max);

if (priv->echo_skb[idx]) {
netif_rx(priv->echo_skb[idx]);
priv->echo_skb[idx] = NULL;
Expand All @@ -327,10 +332,12 @@ EXPORT_SYMBOL_GPL(can_get_echo_skb);
*
* The function is typically called when TX failed.
*/
void can_free_echo_skb(struct net_device *dev, int idx)
void can_free_echo_skb(struct net_device *dev, unsigned int idx)
{
struct can_priv *priv = netdev_priv(dev);

BUG_ON(idx >= priv->echo_skb_max);

if (priv->echo_skb[idx]) {
kfree_skb(priv->echo_skb[idx]);
priv->echo_skb[idx] = NULL;
Expand Down Expand Up @@ -445,17 +452,30 @@ static void can_setup(struct net_device *dev)
/*
* Allocate and setup space for the CAN network device
*/
struct net_device *alloc_candev(int sizeof_priv)
struct net_device *alloc_candev(int sizeof_priv, unsigned int echo_skb_max)
{
struct net_device *dev;
struct can_priv *priv;
int size;

dev = alloc_netdev(sizeof_priv, "can%d", can_setup);
if (echo_skb_max)
size = ALIGN(sizeof_priv, sizeof(struct sk_buff *)) +
echo_skb_max * sizeof(struct sk_buff *);
else
size = sizeof_priv;

dev = alloc_netdev(size, "can%d", can_setup);
if (!dev)
return NULL;

priv = netdev_priv(dev);

if (echo_skb_max) {
priv->echo_skb_max = echo_skb_max;
priv->echo_skb = (void *)priv +
ALIGN(sizeof_priv, sizeof(struct sk_buff *));
}

priv->state = CAN_STATE_STOPPED;

init_timer(&priv->restart_timer);
Expand Down
3 changes: 2 additions & 1 deletion trunk/drivers/net/can/sja1000/sja1000.c
Original file line number Diff line number Diff line change
Expand Up @@ -565,7 +565,8 @@ struct net_device *alloc_sja1000dev(int sizeof_priv)
struct net_device *dev;
struct sja1000_priv *priv;

dev = alloc_candev(sizeof(struct sja1000_priv) + sizeof_priv);
dev = alloc_candev(sizeof(struct sja1000_priv) + sizeof_priv,
SJA1000_ECHO_SKB_MAX);
if (!dev)
return NULL;

Expand Down
2 changes: 2 additions & 0 deletions trunk/drivers/net/can/sja1000/sja1000.h
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,8 @@
#include <linux/can/dev.h>
#include <linux/can/platform/sja1000.h>

#define SJA1000_ECHO_SKB_MAX 1 /* the SJA1000 has one TX buffer object */

#define SJA1000_MAX_IRQ 20 /* max. number of interrupts handled in ISR */

/* SJA1000 registers - manual section 6.4 (Pelican Mode) */
Expand Down
6 changes: 1 addition & 5 deletions trunk/drivers/net/can/ti_hecc.c
Original file line number Diff line number Diff line change
Expand Up @@ -74,10 +74,6 @@ MODULE_VERSION(HECC_MODULE_VERSION);
#define HECC_MB_TX_SHIFT 2 /* as per table above */
#define HECC_MAX_TX_MBOX BIT(HECC_MB_TX_SHIFT)

#if (HECC_MAX_TX_MBOX > CAN_ECHO_SKB_MAX)
#error "HECC: MAX TX mailboxes should be equal or less than CAN_ECHO_SKB_MAX"
#endif

#define HECC_TX_PRIO_SHIFT (HECC_MB_TX_SHIFT)
#define HECC_TX_PRIO_MASK (MAX_TX_PRIO << HECC_MB_TX_SHIFT)
#define HECC_TX_MB_MASK (HECC_MAX_TX_MBOX - 1)
Expand Down Expand Up @@ -902,7 +898,7 @@ static int ti_hecc_probe(struct platform_device *pdev)
goto probe_exit_free_region;
}

ndev = alloc_candev(sizeof(struct ti_hecc_priv));
ndev = alloc_candev(sizeof(struct ti_hecc_priv), HECC_MAX_TX_MBOX);
if (!ndev) {
dev_err(&pdev->dev, "alloc_candev failed\n");
err = -ENOMEM;
Expand Down
4 changes: 2 additions & 2 deletions trunk/drivers/net/can/usb/ems_usb.c
Original file line number Diff line number Diff line change
Expand Up @@ -232,7 +232,7 @@ MODULE_DEVICE_TABLE(usb, ems_usb_table);
#define INTR_IN_BUFFER_SIZE 4

#define MAX_RX_URBS 10
#define MAX_TX_URBS CAN_ECHO_SKB_MAX
#define MAX_TX_URBS 10

struct ems_usb;

Expand Down Expand Up @@ -1012,7 +1012,7 @@ static int ems_usb_probe(struct usb_interface *intf,
struct ems_usb *dev;
int i, err = -ENOMEM;

netdev = alloc_candev(sizeof(struct ems_usb));
netdev = alloc_candev(sizeof(struct ems_usb), MAX_TX_URBS);
if (!netdev) {
dev_err(netdev->dev.parent, "Couldn't alloc candev\n");
return -ENOMEM;
Expand Down
16 changes: 8 additions & 8 deletions trunk/include/linux/can/dev.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,6 @@ enum can_mode {
/*
* CAN common private data
*/
#define CAN_ECHO_SKB_MAX 4

struct can_priv {
struct can_device_stats can_stats;

Expand All @@ -44,15 +42,16 @@ struct can_priv {
int restart_ms;
struct timer_list restart_timer;

struct sk_buff *echo_skb[CAN_ECHO_SKB_MAX];

int (*do_set_bittiming)(struct net_device *dev);
int (*do_set_mode)(struct net_device *dev, enum can_mode mode);
int (*do_get_state)(const struct net_device *dev,
enum can_state *state);

unsigned int echo_skb_max;
struct sk_buff **echo_skb;
};

struct net_device *alloc_candev(int sizeof_priv);
struct net_device *alloc_candev(int sizeof_priv, unsigned int echo_skb_max);
void free_candev(struct net_device *dev);

int open_candev(struct net_device *dev);
Expand All @@ -64,8 +63,9 @@ void unregister_candev(struct net_device *dev);
int can_restart_now(struct net_device *dev);
void can_bus_off(struct net_device *dev);

void can_put_echo_skb(struct sk_buff *skb, struct net_device *dev, int idx);
void can_get_echo_skb(struct net_device *dev, int idx);
void can_free_echo_skb(struct net_device *dev, int idx);
void can_put_echo_skb(struct sk_buff *skb, struct net_device *dev,
unsigned int idx);
void can_get_echo_skb(struct net_device *dev, unsigned int idx);
void can_free_echo_skb(struct net_device *dev, unsigned int idx);

#endif /* CAN_DEV_H */

0 comments on commit 4dd0197

Please sign in to comment.