From: "Dale Farnsworth" <dale@farnsworth.org>
To: Netdev <netdev@oss.sgi.com>, Jeff Garzik <jgarzik@pobox.com>
Cc: Ralf Baechle <ralf@linux-mips.org>,
Manish Lachwani <mlachwani@mvista.com>,
Brian Waite <brian@waitefamily.us>,
"Steven J. Hill" <sjhill@realitydiluted.com>,
Benjamin Herrenschmidt <benh@kernel.crashing.org>,
James Chapman <jchapman@katalix.com>
Subject: mv643xx(6/20): use netif_msg_xxx() to control log messages where appropriate
Date: Mon, 28 Mar 2005 16:46:53 -0700 [thread overview]
Message-ID: <20050328234653.GF29098@xyzzy> (raw)
In-Reply-To: <20050328233807.GA28423@xyzzy>
Network driver messages can be controlled using ethtool msglvl via the
netif_msg_xxx() macros. This patch allows mv643xx's driver message
verbosity to be controlled by ethtool.
Some debug messages have also been added (not enabled by default) to
trace low-level (per packet) device access.
Signed-off-by: James Chapman <jchapman@katalix.com>
Acked-by: Dale Farnsworth <dale@farnsworth.org>
Index: linux-2.5-enet/drivers/net/mv643xx_eth.h
===================================================================
--- linux-2.5-enet.orig/drivers/net/mv643xx_eth.h
+++ linux-2.5-enet/drivers/net/mv643xx_eth.h
@@ -564,6 +564,7 @@
u32 msg_enable;
struct mii_if_info mii;
+ struct net_device *netdev;
};
/* ethernet.h API list */
@@ -582,12 +583,12 @@
unsigned char *p_addr);
/* PHY and MIB routines */
-static void ethernet_phy_reset(unsigned int eth_port_num);
+static void ethernet_phy_reset(struct mv643xx_private *mp);
-static void eth_port_write_smi_reg(unsigned int eth_port_num,
+static void eth_port_write_smi_reg(struct mv643xx_private *mp,
unsigned int phy_reg, unsigned int value);
-static void eth_port_read_smi_reg(unsigned int eth_port_num,
+static void eth_port_read_smi_reg(struct mv643xx_private *mp,
unsigned int phy_reg, unsigned int *value);
static void eth_clear_mib_counters(unsigned int eth_port_num);
Index: linux-2.5-enet/drivers/net/mv643xx_eth.c
===================================================================
--- linux-2.5-enet.orig/drivers/net/mv643xx_eth.c
+++ linux-2.5-enet/drivers/net/mv643xx_eth.c
@@ -86,7 +86,7 @@
#endif
static int ethernet_phy_get(unsigned int eth_port_num);
static void ethernet_phy_set(unsigned int eth_port_num, int phy_addr);
-static int ethernet_phy_detect(unsigned int eth_port_num);
+static int ethernet_phy_detect(struct mv643xx_private *mp);
static int mv643xx_mdio_read(struct net_device *dev, int phy_id, int location);
static void mv643xx_mdio_write(struct net_device *dev, int phy_id, int location, int val);
static int mv643xx_eth_do_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd);
@@ -199,7 +199,8 @@
* again in a later time .
*/
if ((mp->rx_ring_skbs == 0) && (mp->rx_timer_flag == 0)) {
- printk(KERN_INFO "%s: Rx ring is empty\n", dev->name);
+ if (netif_msg_rx_status(mp))
+ printk(KERN_INFO "%s: Rx ring is empty\n", dev->name);
/* After 100mSec */
mp->timeout.expires = jiffies + (HZ / 10);
add_timer(&mp->timeout);
@@ -306,7 +307,8 @@
{
struct mv643xx_private *mp = netdev_priv(dev);
- printk(KERN_INFO "%s: TX timeout ", dev->name);
+ if (netif_msg_tx_err(mp))
+ printk(KERN_INFO "%s: TX timeout ", dev->name);
/* Do the reset outside of interrupt context */
schedule_work(&mp->tx_timeout_task);
@@ -350,7 +352,9 @@
/* Check only queue 0 */
while (eth_tx_return_desc(mp, &pkt_info) == ETH_OK) {
if (pkt_info.cmd_sts & BIT0) {
- printk("%s: Error in TX\n", dev->name);
+ if (netif_msg_tx_err(mp))
+ printk(KERN_WARNING "%s: Error in TX: cmd_sts=%08x\n",
+ dev->name, pkt_info.cmd_sts);
stats->tx_errors++;
}
@@ -440,11 +444,10 @@
if ((pkt_info.cmd_sts & (ETH_RX_FIRST_DESC |
ETH_RX_LAST_DESC)) !=
(ETH_RX_FIRST_DESC | ETH_RX_LAST_DESC)) {
- if (net_ratelimit())
- printk(KERN_ERR
- "%s: Received packet spread "
- "on multiple descriptors\n",
- dev->name);
+ if (net_ratelimit() && netif_msg_rx_err(mp))
+ printk(KERN_WARNING "%s: Received "
+ "packet spread on multiple "
+ "descriptors\n", dev->name);
}
if (pkt_info.cmd_sts & ETH_ERROR_SUMMARY)
stats->rx_errors++;
@@ -812,7 +815,7 @@
}
if (mv643xx_eth_real_open(dev)) {
- printk("%s: Error opening interface\n", dev->name);
+ printk(KERN_ERR "%s: Error opening interface\n", dev->name);
err = -EBUSY;
goto out_free;
}
@@ -1019,8 +1022,6 @@
if (!mp->p_rx_desc_area) {
printk(KERN_ERR "%s: Cannot allocate Rx ring (size %d bytes)\n",
dev->name, size);
- printk(KERN_ERR "%s: Freeing previously allocated TX queues...",
- dev->name);
if (mp->rx_sram_size)
iounmap(mp->p_rx_desc_area);
else
@@ -1070,8 +1071,8 @@
}
}
if (mp->tx_ring_skbs)
- printk("%s: Error on Tx descriptor free - could not free %d"
- " descriptors\n", dev->name, mp->tx_ring_skbs);
+ printk(KERN_ERR "%s: Error on Tx descriptor free - could not "
+ "free %d descriptors\n", dev->name, mp->tx_ring_skbs);
/* Free TX ring */
if (mp->tx_sram_size)
@@ -1099,10 +1100,10 @@
}
if (mp->rx_ring_skbs)
- printk(KERN_ERR
- "%s: Error in freeing Rx Ring. %d skb's still"
- " stuck in RX Ring - ignoring them\n", dev->name,
- mp->rx_ring_skbs);
+ printk(KERN_ERR "%s: Error in freeing Rx Ring. "
+ "%d skb's still stuck in RX Ring - "
+ "ignoring them\n", dev->name, mp->rx_ring_skbs);
+
/* Free RX ring */
if (mp->rx_sram_size)
iounmap(mp->p_rx_desc_area);
@@ -1264,9 +1265,8 @@
struct pkt_info pkt_info;
if (netif_queue_stopped(dev)) {
- printk(KERN_ERR
- "%s: Tried sending packet when interface is stopped\n",
- dev->name);
+ printk(KERN_ERR "%s: Tried sending packet when interface is "
+ "stopped\n", dev->name);
return 1;
}
@@ -1274,16 +1274,15 @@
if ((mp->tx_ring_size - mp->tx_ring_skbs) <=
(skb_shinfo(skb)->nr_frags + 1)) {
netif_stop_queue(dev);
- printk(KERN_ERR
- "%s: Bug in mv643xx_eth - Trying to transmit when"
- " queue full !\n", dev->name);
+ printk(KERN_ERR "%s: Trying to transmit when queue full!\n",
+ dev->name);
return 1;
}
/* Paranoid check - this shouldn't happen */
if (skb == NULL) {
stats->tx_dropped++;
- printk(KERN_ERR "mv64320_eth paranoid check failed\n");
+ printk(KERN_ERR "%s: paranoid check failed\n", dev->name);
return 1;
}
@@ -1311,9 +1310,8 @@
} else if (skb->nh.iph->protocol == IPPROTO_TCP)
pkt_info.l4i_chk = skb->h.th->check;
else {
- printk(KERN_ERR
- "%s: chksum proto != TCP or UDP\n",
- dev->name);
+ printk(KERN_ERR "%s: chksum proto != TCP "
+ "or UDP\n", dev->name);
spin_unlock_irqrestore(&mp->lock, flags);
return 1;
}
@@ -1325,8 +1323,9 @@
mp->tx_ring_skbs++;
status = eth_port_send(mp, &pkt_info);
if ((status == ETH_ERROR) || (status == ETH_QUEUE_FULL))
- printk(KERN_ERR "%s: Error on transmitting packet\n",
- dev->name);
+ if (netif_msg_tx_err(mp))
+ printk(KERN_WARNING "%s: Error on transmitting "
+ "packet\n", dev->name);
stats->tx_bytes += pkt_info.byte_cnt;
} else {
unsigned int frag;
@@ -1344,10 +1343,12 @@
fragp = &skb_shinfo(skb)->frags[frag];
if (fragp->size <= 8 && fragp->page_offset & 0x7) {
skb_linearize(skb, GFP_ATOMIC);
- printk(KERN_DEBUG "%s: unaligned tiny fragment"
- "%d of %d, fixed\n",
- dev->name, frag,
- skb_shinfo(skb)->nr_frags);
+ if (netif_msg_pktdata(mp))
+ printk(KERN_DEBUG "%s: unaligned "
+ "tiny fragment"
+ "%d of %d, fixed\n",
+ dev->name, frag,
+ skb_shinfo(skb)->nr_frags);
goto linear;
}
}
@@ -1372,9 +1373,8 @@
} else if (skb->nh.iph->protocol == IPPROTO_TCP)
pkt_info.l4i_chk = skb->h.th->check;
else {
- printk(KERN_ERR
- "%s: chksum proto != TCP or UDP\n",
- dev->name);
+ printk(KERN_ERR "%s: chksum proto != TCP "
+ "or UDP\n", dev->name);
spin_unlock_irqrestore(&mp->lock, flags);
return 1;
}
@@ -1383,13 +1383,16 @@
status = eth_port_send(mp, &pkt_info);
if (status != ETH_OK) {
if ((status == ETH_ERROR))
- printk(KERN_ERR
- "%s: Error on transmitting packet\n",
- dev->name);
+ printk(KERN_WARNING "%s: Error on "
+ "transmitting packet\n",
+ dev->name);
if (status == ETH_QUEUE_FULL)
- printk("Error on Queue Full \n");
+ printk(KERN_WARNING "%s: Error on "
+ "Queue Full\n",
+ dev->name);
if (status == ETH_QUEUE_LAST_RESOURCE)
- printk("Tx resource error \n");
+ printk(KERN_WARNING "%s: Tx resource error\n",
+ dev->name);
}
stats->tx_bytes += pkt_info.byte_cnt;
@@ -1420,15 +1423,20 @@
if (status != ETH_OK) {
if ((status == ETH_ERROR))
- printk(KERN_ERR "%s: Error on "
- "transmitting packet\n",
- dev->name);
+ if (netif_msg_tx_err(mp))
+ printk(KERN_WARNING "%s: Error on "
+ "transmitting packet\n",
+ dev->name);
if (status == ETH_QUEUE_LAST_RESOURCE)
- printk("Tx resource error \n");
+ if (netif_msg_tx_err(mp))
+ printk(KERN_WARNING "%s: Tx resource "
+ "error\n", dev->name);
if (status == ETH_QUEUE_FULL)
- printk("Queue is full \n");
+ if (netif_msg_tx_err(mp))
+ printk(KERN_WARNING "%s: Queue is full\n",
+ dev->name);
}
stats->tx_bytes += pkt_info.byte_cnt;
}
@@ -1444,8 +1452,10 @@
mp->tx_ring_skbs++;
status = eth_port_send(mp, &pkt_info);
if ((status == ETH_ERROR) || (status == ETH_QUEUE_FULL))
- printk(KERN_ERR "%s: Error on transmitting packet\n",
- dev->name);
+ if (netif_msg_tx_err(mp))
+ printk(KERN_WARNING "%s: Error on transmitting packet\n",
+ dev->name);
+
stats->tx_bytes += pkt_info.byte_cnt;
#endif
@@ -1516,6 +1526,7 @@
dev_set_drvdata(ddev, dev);
mp = netdev_priv(dev);
+ mp->netdev = dev;
/* By default, log probe, interface up/down and error events */
mp->msg_enable = NETIF_MSG_PROBE | NETIF_MSG_IFUP | NETIF_MSG_IFDOWN |
@@ -1621,11 +1632,11 @@
mp->mii.phy_id_mask = 0x3f;
mp->mii.reg_num_mask = 0x1f;
- err = ethernet_phy_detect(port_num);
+ err = ethernet_phy_detect(mp);
if (err) {
- pr_debug("MV643xx ethernet port %d: "
- "No PHY detected at addr %d\n",
- port_num, ethernet_phy_get(port_num));
+ printk(KERN_ERR "MV643xx ethernet port %d: "
+ "No PHY detected at addr %d\n",
+ port_num, ethernet_phy_get(port_num));
return err;
}
@@ -1636,28 +1647,36 @@
mp->mii.supports_gmii = mii_check_gmii_support(&mp->mii);
p = dev->dev_addr;
- printk(KERN_NOTICE
- "%s: port %d with MAC address %02x:%02x:%02x:%02x:%02x:%02x\n",
- dev->name, port_num, p[0], p[1], p[2], p[3], p[4], p[5]);
+ if (netif_msg_probe(mp))
+ printk(KERN_NOTICE "%s: has MAC address "
+ "%02x:%02x:%02x:%02x:%02x:%02x\n",
+ dev->name, p[0], p[1], p[2], p[3], p[4], p[5]);
if (dev->features & NETIF_F_SG)
- printk(KERN_NOTICE "%s: Scatter Gather Enabled\n", dev->name);
+ if (netif_msg_probe(mp))
+ printk(KERN_NOTICE "%s: Scatter Gather Enabled\n",
+ dev->name);
if (dev->features & NETIF_F_IP_CSUM)
- printk(KERN_NOTICE "%s: TX TCP/IP Checksumming Supported\n",
- dev->name);
+ if (netif_msg_probe(mp))
+ printk(KERN_NOTICE "%s: TX TCP/IP Checksumming Supported\n",
+ dev->name);
#ifdef MV643XX_CHECKSUM_OFFLOAD_TX
- printk(KERN_NOTICE "%s: RX TCP/UDP Checksum Offload ON \n", dev->name);
+ if (netif_msg_probe(mp))
+ printk(KERN_NOTICE "%s: RX TCP/UDP Checksum Offload ON\n",
+ dev->name);
#endif
#ifdef MV643XX_COAL
- printk(KERN_NOTICE "%s: TX and RX Interrupt Coalescing ON \n",
- dev->name);
+ if (netif_msg_probe(mp))
+ printk(KERN_NOTICE "%s: TX and RX Interrupt Coalescing ON\n",
+ dev->name);
#endif
#ifdef MV643XX_NAPI
- printk(KERN_NOTICE "%s: RX NAPI Enabled \n", dev->name);
+ if (netif_msg_probe(mp))
+ printk(KERN_NOTICE "%s: RX NAPI Enabled\n", dev->name);
#endif
return 0;
@@ -1958,7 +1977,7 @@
eth_port_init_mac_tables(mp->port_num);
- ethernet_phy_reset(mp->port_num);
+ ethernet_phy_reset(mp);
}
/*
@@ -2287,22 +2306,22 @@
* -ENODEV on failure
*
*/
-static int ethernet_phy_detect(unsigned int port_num)
+static int ethernet_phy_detect(struct mv643xx_private *mp)
{
unsigned int phy_reg_data0;
int auto_neg;
- eth_port_read_smi_reg(port_num, 0, &phy_reg_data0);
+ eth_port_read_smi_reg(mp, 0, &phy_reg_data0);
auto_neg = phy_reg_data0 & 0x1000;
phy_reg_data0 ^= 0x1000; /* invert auto_neg */
- eth_port_write_smi_reg(port_num, 0, phy_reg_data0);
+ eth_port_write_smi_reg(mp, 0, phy_reg_data0);
- eth_port_read_smi_reg(port_num, 0, &phy_reg_data0);
+ eth_port_read_smi_reg(mp, 0, &phy_reg_data0);
if ((phy_reg_data0 & 0x1000) == auto_neg)
return -ENODEV; /* change didn't take */
phy_reg_data0 ^= 0x1000;
- eth_port_write_smi_reg(port_num, 0, phy_reg_data0);
+ eth_port_write_smi_reg(mp, 0, phy_reg_data0);
return 0;
}
@@ -2375,14 +2394,14 @@
* None.
*
*/
-static void ethernet_phy_reset(unsigned int eth_port_num)
+static void ethernet_phy_reset(struct mv643xx_private *mp)
{
unsigned int phy_reg_data;
/* Reset the PHY */
- eth_port_read_smi_reg(eth_port_num, 0, &phy_reg_data);
+ eth_port_read_smi_reg(mp, 0, &phy_reg_data);
phy_reg_data |= 0x8000; /* Set bit 15 to reset the PHY */
- eth_port_write_smi_reg(eth_port_num, 0, phy_reg_data);
+ eth_port_write_smi_reg(mp, 0, phy_reg_data);
}
/*
@@ -2520,9 +2539,10 @@
* true otherwise.
*
*/
-static void eth_port_read_smi_reg(unsigned int port_num,
+static void eth_port_read_smi_reg(struct mv643xx_private *mp,
unsigned int phy_reg, unsigned int *value)
{
+ unsigned int port_num = mp->port_num;
int phy_addr = ethernet_phy_get(port_num);
unsigned long flags;
int i;
@@ -2533,7 +2553,8 @@
/* wait for the SMI register to become available */
for (i = 0; mv_read(MV643XX_ETH_SMI_REG) & ETH_SMI_BUSY; i++) {
if (i == PHY_WAIT_ITERATIONS) {
- printk("mv643xx PHY busy timeout, port %d\n", port_num);
+ printk(KERN_ERR "%s: PHY busy timeout\n",
+ mp->netdev->name);
goto out;
}
udelay(PHY_WAIT_MICRO_SECONDS);
@@ -2545,7 +2566,8 @@
/* now wait for the data to be valid */
for (i = 0; !(mv_read(MV643XX_ETH_SMI_REG) & ETH_SMI_READ_VALID); i++) {
if (i == PHY_WAIT_ITERATIONS) {
- printk("mv643xx PHY read timeout, port %d\n", port_num);
+ printk(KERN_ERR "%s: PHY read timeout\n",
+ mp->netdev->name);
goto out;
}
udelay(PHY_WAIT_MICRO_SECONDS);
@@ -2576,12 +2598,13 @@
* true otherwise.
*
*/
-static void eth_port_write_smi_reg(unsigned int eth_port_num,
+static void eth_port_write_smi_reg(struct mv643xx_private *mp,
unsigned int phy_reg, unsigned int value)
{
int phy_addr;
int i;
unsigned long flags;
+ unsigned int eth_port_num = mp->port_num;
phy_addr = ethernet_phy_get(eth_port_num);
@@ -2591,8 +2614,8 @@
/* wait for the SMI register to become available */
for (i = 0; mv_read(MV643XX_ETH_SMI_REG) & ETH_SMI_BUSY; i++) {
if (i == PHY_WAIT_ITERATIONS) {
- printk("mv643xx PHY busy timeout, port %d\n",
- eth_port_num);
+ printk(KERN_ERR "%s: PHY busy timeout\n",
+ mp->netdev->name);
goto out;
}
udelay(PHY_WAIT_MICRO_SECONDS);
@@ -2612,14 +2635,14 @@
int val;
struct mv643xx_private *mp = netdev_priv(dev);
- eth_port_read_smi_reg(mp->port_num, location, &val);
+ eth_port_read_smi_reg(mp, location, &val);
return val;
}
static void mv643xx_mdio_write(struct net_device *dev, int phy_id, int location, int val)
{
struct mv643xx_private *mp = netdev_priv(dev);
- eth_port_write_smi_reg(mp->port_num, location, val);
+ eth_port_write_smi_reg(mp, location, val);
}
/*
@@ -2670,9 +2693,8 @@
* in length must be aligned on an 8 byte boundary.
*/
if (p_pkt_info->byte_cnt <= 8 && p_pkt_info->buf_ptr & 0x7) {
- printk(KERN_ERR
- "mv643xx_eth port %d: packet size <= 8 problem\n",
- mp->port_num);
+ printk(KERN_ERR "%s: packet size <= 8 (%d) problem\n",
+ dev->name, p_pkt_info->byte_cnt);
return ETH_ERROR;
}
@@ -2703,6 +2725,13 @@
current_descriptor->cmd_sts = command;
}
+ if (netif_msg_txqueued(mp))
+ printk( KERN_DEBUG "%s: send pkt: len=%d, desc=%d, "
+ "f/l=%d/%d\n", dev->name,
+ p_pkt_info->byte_cnt, tx_desc_curr,
+ ((command & ETH_TX_FIRST_DESC) != 0),
+ ((command & ETH_TX_LAST_DESC) != 0));
+
if (command & ETH_TX_LAST_DESC) {
wmb();
first_descriptor->cmd_sts = mp->tx_first_command;
@@ -2752,6 +2781,13 @@
current_descriptor->byte_cnt = p_pkt_info->byte_cnt;
mp->tx_skb[tx_desc_curr] = p_pkt_info->return_info;
+ if (netif_msg_tx_queued(mp))
+ printk(KERN_DEBUG "%s: send pkt: desc=%d len=%d, f/l=%d/%d\n",
+ mp->netdev->name, tx_desc_curr,
+ p_pkt_info->byte_cnt,
+ ((command_status & ETH_TX_FIRST_DESC) != 0),
+ ((command_status & ETH_TX_LAST_DESC) != 0));
+
/* Set last desc with DMA ownership and interrupt enable. */
wmb();
current_descriptor->cmd_sts = command_status |
@@ -2899,6 +2935,13 @@
p_pkt_info->return_info = mp->rx_skb[rx_curr_desc];
p_pkt_info->l4i_chk = p_rx_desc->buf_size;
+ if (netif_msg_rx_status(mp))
+ printk(KERN_DEBUG "%s: rcv pkt: len=%d, desc=%d, f/l=%d/%d\n",
+ mp->netdev->name,
+ p_pkt_info->byte_cnt, rx_curr_desc,
+ ((command_status & ETH_RX_FIRST_DESC) != 0),
+ ((command_status & ETH_RX_LAST_DESC) != 0));
+
/* Clean the return info field to indicate that the packet has been */
/* moved to the upper layers */
mp->rx_skb[rx_curr_desc] = NULL;
@@ -2948,6 +2991,11 @@
p_used_rx_desc->buf_size = p_pkt_info->byte_cnt;
mp->rx_skb[used_rx_desc] = p_pkt_info->return_info;
+ if (netif_msg_rx_status(mp))
+ printk(KERN_DEBUG "%s: rx done, len=%d, desc=%d, status=%08x\n",
+ mp->netdev->name, p_pkt_info->byte_cnt, used_rx_desc,
+ p_used_rx_desc->cmd_sts);
+
/* Flush the write pipe */
/* Return the descriptor to DMA ownership */
next prev parent reply other threads:[~2005-03-28 23:46 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2005-03-28 23:38 [PATCH: 2.6.12-rc1] mv643xx: ethernet driver updates Dale Farnsworth
2005-03-28 23:40 ` mv643xx(1/20): Add mv643xx_enet support for PPC Pegasos platform Dale Farnsworth
2005-03-28 23:42 ` mv643xx(2/20): use MII library for PHY management Dale Farnsworth
2005-08-24 0:34 ` Mark Huth
2005-08-24 0:33 ` Benjamin Herrenschmidt
2005-03-28 23:43 ` mv643xx(3/20): use MII library for ethtool functions Dale Farnsworth
2005-03-28 23:44 ` mv643xx(4/20): Update the Artesyn katana mv643xx ethernet platform data Dale Farnsworth
2005-03-28 23:45 ` mv643xx(5/20): update ppc7d platform for new mv643xx_eth " Dale Farnsworth
2005-03-28 23:46 ` Dale Farnsworth [this message]
2005-03-28 23:47 ` mv643xx(7/20): move static prototypes from header file into driver C file Dale Farnsworth
2005-03-28 23:48 ` mv643xx(8/20): remove ETH_FUNC_RET_STATUS and unused ETH_TARGET enums Dale Farnsworth
2005-03-28 23:49 ` mv643xx(9/20): make internal functions take device pointer param consistently Dale Farnsworth
2005-03-28 23:49 ` mv643xx(10/20): compile fix for non-NAPI case Dale Farnsworth
2005-03-28 23:51 ` mv643xx(11/20): rename all functions to have a common mv643xx_eth prefix Dale Farnsworth
2005-03-28 23:55 ` mv643xx(12/20): reorder code to avoid prototype function declarations Dale Farnsworth
2005-03-28 23:55 ` mv643xx(13/20): remove useless function header block comments Dale Farnsworth
2005-03-28 23:56 ` mv643xx(14/20): whitespace and indentation cleanup Dale Farnsworth
2005-03-28 23:57 ` mv643xx(15/20): Add James Chapman to copyright statement and author list Dale Farnsworth
2005-03-28 23:57 ` mv643xx(16/20): Limit MTU to 1500 bytes unless connected at GigE speed Dale Farnsworth
2005-03-30 20:09 ` Jeff Garzik
2005-03-30 21:46 ` Dale Farnsworth
2005-03-28 23:58 ` mv643xx(17/20): Reset the PHY only at driver open time Dale Farnsworth
2005-03-28 23:59 ` mv643xx(18/20): Isolate the PHY at device close Dale Farnsworth
2005-03-29 0:00 ` mv643xx(19/20): Ensure NAPI poll routine only clears IRQs it handles Dale Farnsworth
2005-03-29 0:01 ` mv643xx(20/20): Fix promiscuous mode handling Dale Farnsworth
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20050328234653.GF29098@xyzzy \
--to=dale@farnsworth.org \
--cc=benh@kernel.crashing.org \
--cc=brian@waitefamily.us \
--cc=jchapman@katalix.com \
--cc=jgarzik@pobox.com \
--cc=mlachwani@mvista.com \
--cc=netdev@oss.sgi.com \
--cc=ralf@linux-mips.org \
--cc=sjhill@realitydiluted.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).