[PATCH][5/5] RapidIO support: net driver over messaging

Stephen Hemminger shemminger at osdl.org
Fri Jun 3 08:05:43 EST 2005


How much is this like ethernet? does it still do ARP?
Can it do promiscious receive?

> +LIST_HEAD(rionet_peers);

Does this have to be global?

Not sure about the locking of this stuff, are you
relying on the RTNL?

> +
> +static int rionet_change_mtu(struct net_device *ndev, int new_mtu)
> +{
> +	struct rionet_private *rnet = ndev->priv;
> +
> +	if (netif_msg_drv(rnet))
> +		printk(KERN_WARNING
> +		       "%s: rionet_change_mtu(): not implemented\n", DRV_NAME);
> +
> +	return 0;
> +}

If you can allow any mtu then don't need this at all.
Or if you are limited then better return an error for bad values.

> +static void rionet_set_multicast_list(struct net_device *ndev)
> +{
> +	struct rionet_private *rnet = ndev->priv;
> +
> +	if (netif_msg_drv(rnet))
> +		printk(KERN_WARNING
> +		       "%s: rionet_set_multicast_list(): not implemented\n",
> +		       DRV_NAME);
> +}

If you can't handle it then just leave dev->set_multicast_list
as NULL and all attempts to add or delete will get -EINVAL

> +
> +static int rionet_open(struct net_device *ndev)
> +{


> +	/* Initialize inbound message ring */
> +	for (i = 0; i < RIONET_RX_RING_SIZE; i++)
> +		rnet->rx_skb[i] = NULL;
> +	rnet->rx_slot = 0;
> +	rionet_rx_fill(ndev, 0);
> +
> +	rnet->tx_slot = 0;
> +	rnet->tx_cnt = 0;
> +	rnet->ack_slot = 0;
> +
> +	spin_lock_init(&rnet->lock);
> +
> +	rnet->msg_enable = RIONET_DEFAULT_MSGLEVEL;

Better to do all initialization of the per device data
in the place it is allocated (rio_setup_netdev)
> +
> +static int rionet_ioctl(struct net_device *ndev, struct ifreq *rq, int cmd)
> +{
> +	return -EOPNOTSUPP;
> +}

Unneeded, if dev->do_ioctl is NULL, then all private ioctl's will
return -EINVAL that is what you want.

> +
> +static u32 rionet_get_link(struct net_device *ndev)
> +{
> +	return netif_carrier_ok(ndev);
> +}

Use ethtool_op_get_link
> +
> +static int rionet_setup_netdev(struct rio_mport *mport)
> +{
> +	int rc = 0;
> +	struct net_device *ndev = NULL;
> +	struct rionet_private *rnet;
> +	u16 device_id;
> +
> +	/* Allocate our net_device structure */
> +	ndev = alloc_etherdev(sizeof(struct rionet_private));
> +	if (ndev == NULL) {
> +		printk(KERN_INFO "%s: could not allocate ethernet device.\n",
> +		       DRV_NAME);
> +		rc = -ENOMEM;
> +		goto out;
> +	}
> +
> +	/*
> +	 * XXX hack, store point a static at ndev so we can get it...
> +	 * Perhaps need an array of these that the handler can
> +	 * index via the mbox number.
> +	 */
> +	sndev = ndev;
> +
> +	/* Set up private area */
> +	rnet = (struct rionet_private *)ndev->priv;
> +	rnet->mport = mport;
> +
> +	/* Set the default MAC address */
> +	device_id = rio_local_get_device_id(mport);
> +	ndev->dev_addr[0] = 0x00;
> +	ndev->dev_addr[1] = 0x01;
> +	ndev->dev_addr[2] = 0x00;
> +	ndev->dev_addr[3] = 0x01;
> +	ndev->dev_addr[4] = device_id >> 8;
> +	ndev->dev_addr[5] = device_id & 0xff;
> +
> +	/* Fill in the driver function table */
> +	ndev->open = &rionet_open;
> +	ndev->hard_start_xmit = &rionet_start_xmit;
> +	ndev->stop = &rionet_close;
> +	ndev->get_stats = &rionet_stats;
> +	ndev->change_mtu = &rionet_change_mtu;
> +	ndev->set_mac_address = &rionet_set_mac_address;
> +	ndev->set_multicast_list = &rionet_set_multicast_list;
> +	ndev->do_ioctl = &rionet_ioctl;
> +	SET_ETHTOOL_OPS(ndev, &rionet_ethtool_ops);
> +
> +	ndev->mtu = RIO_MAX_MSG_SIZE - 14;
> +
> +	SET_MODULE_OWNER(ndev);

Can you set any ndev->features to get better performance. 
	Can you take >32bit data addresses? then set HIGHDMA
	You are doing your on locking, can you use LLTX?
	Does the hardware support scatter gather?



More information about the Linuxppc-embedded mailing list