* Re: [PATCH 2.6.17-rc6] Remove Prism II support from Orinoco
From: Faidon Liambotis @ 2006-06-12 15:39 UTC (permalink / raw)
To: John W. Linville; +Cc: Dave Jones, netdev, proski, hermes
In-Reply-To: <20060612152434.GA14851@tuxdriver.com>
On Mon, Jun 12, 2006 at 11:24:39AM -0400, John W. Linville wrote:
> On Mon, Jun 12, 2006 at 01:49:54AM +0300, Faidon Liambotis wrote:
>
> > Having two drivers supporting the same set of hardware seems pretty
> > pointless to me. Plus, it confuses hotplugging/automatic detection.
>
> This subject comes-up from time to time. In fact, I'm pretty sure
> it came-up very recently w.r.t. orinoco and hostap.
I remember a patch that added all of Orinoco PCI IDs to HostAP. I'm not
sure if you're referring to that, but that's pretty different (and
obviously wrong).
> The consensus seems to be that drivers should have IDs for all devices
> they support, even if that means that some devices are supported by
> multiple drivers. This leaves the choice of which driver to use in
> the hands of the user and/or distro.
I'd mostly agree to that if distributors had a way to enable/disable
Prism2 support on the orinoco_cs driver based on a build-time
configuration option.
Should I prepare such a patch?
FWIW, I think we've experienced a similar situation like this in the
past in the networking land and the consensus was to completely remove
the other driver. I'm referring to e100/eepro100, of course.
Regards,
Faidon
^ permalink raw reply
* Re: [RFT] Realtek 8168 ethernet support
From: Francois Romieu @ 2006-06-12 18:49 UTC (permalink / raw)
To: Mourad De Clerck; +Cc: netdev
In-Reply-To: <448D4236.9050505@aquazul.com>
Mourad De Clerck <mourad@aquazul.com> :
[...]
> I just tried this patch set, but it doesn't do anything for the "freeze
> at high speed" I mentioned on 2006-06-09. It still locks up. (As an
> additional data point: I installed win2k on this machine, and it seems
> to have no problems transferring at high speeds. Just wanted to try to
> rule out faulty hardware.)
Please send .config and complete dmesg (starting with 'Linux version ...').
The output of a 'vmstat 1' until it freezes could give some hint.
So could trying a different PCI slot. How do you generate traffic ?
15Mo/s of usual traffic means roughly 1000pps. It is not really high speed.
Unrelated: have you checked the link setting ?
--
Ueimor
^ permalink raw reply
* Re: [PATCH] wan/sdla section fixes
From: Krzysztof Halasa @ 2006-06-12 19:05 UTC (permalink / raw)
To: Randy.Dunlap; +Cc: netdev, mike.mclagan, akpm
In-Reply-To: <20060612110523.300a3420.rdunlap@xenotime.net>
"Randy.Dunlap" <rdunlap@xenotime.net> writes:
>> > static const char* version = "SDLA driver v0.30, 12 Sep 1996,
>> > mike.mclagan@linux.org";
>>
>> 1996 doesn't look encouraging but it may be misleading.
>
> Yep. You could ignore it :) or rm drivers/net/wan/slda* :)
I don't know, maybe Mike will say something?
--
Krzysztof Halasa
^ permalink raw reply
* [PATCH] d80211: update tx.skb after TX handler calls
From: Jiri Benc @ 2006-06-12 19:09 UTC (permalink / raw)
To: NetDev; +Cc: John W. Linville
TX and RX handlers are allowed to change skb. Fix (hopefully) the last place
where this is not taken into account.
Signed-off-by: Jiri Benc <jbenc@suse.cz>
---
net/d80211/ieee80211.c | 1 +
1 files changed, 1 insertion(+)
--- dscape.orig/net/d80211/ieee80211.c
+++ dscape/net/d80211/ieee80211.c
@@ -1760,6 +1760,7 @@ ieee80211_get_buffered_bc(struct net_dev
break;
}
dev_put(tx.dev);
+ skb = tx.skb; /* handlers are allowed to change skb */
if (res == TXRX_DROP) {
I802_DEBUG_INC(local->tx_handlers_drop);
^ permalink raw reply
* Re: [PATCH] netpoll: break recursive loop in netpoll rx path
From: Neil Horman @ 2006-06-12 19:13 UTC (permalink / raw)
To: Matt Mackall; +Cc: netdev, jmoyer
In-Reply-To: <20060612155120.GO24227@waste.org>
On Mon, Jun 12, 2006 at 10:51:21AM -0500, Matt Mackall wrote:
> On Mon, Jun 12, 2006 at 11:40:29AM -0400, Neil Horman wrote:
> > Hey there-
> > the netpoll system currently has a rx to tx path via:
> > netpoll_rx
> > __netpoll_rx
> > arp_reply
> > netpoll_send_skb
> > dev->hard_start_tx
> >
> > This rx->tx loop places network drivers at risk of
> > inadvertently causing a deadlock or BUG halt by recursively trying
> > to acquire a spinlock that is used in both their rx and tx paths
> > (this problem was origionally reported to me in the 3c59x driver,
> > which shares a spinlock between the boomerang_interrupt and
> > boomerang_start_xmit routines).
>
> Grumble.
>
> > This patch breaks this loop, by queueing arp frames, so that they
> > can be responded to after all receive operations have been
> > completed. Tested by myself and the reported with successful
> > results.
>
> Tested how? kgdb?
>
Specifically It was tested with netdump. Heres the BZ with details:
https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=194055
> > + if (likely(npi))
> > + while ((skb = skb_dequeue(&npi->arp_tx)) != NULL)
> > + arp_reply(skb);
> > +
>
> Assignment inside tests is frowned upon. I'd prefer pulling this out
> to its own function too.
>
Sure, no problem. New patch attached with suggested modifications made
Regards
Neil
Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
include/linux/netpoll.h | 1 +
net/core/netpoll.c | 27 +++++++++++++++++++++++++--
2 files changed, 26 insertions(+), 2 deletions(-)
--- linux-2.6/include/linux/netpoll.h.orig 2006-06-12 09:11:01.000000000 -0400
+++ linux-2.6/include/linux/netpoll.h 2006-06-12 09:34:17.000000000 -0400
@@ -31,6 +31,7 @@ struct netpoll_info {
int rx_flags;
spinlock_t rx_lock;
struct netpoll *rx_np; /* netpoll that registered an rx_hook */
+ struct sk_buff_head arp_tx; /* list of arp requests to reply to */
};
void netpoll_poll(struct netpoll *np);
--- linux-2.6/net/core/netpoll.c.orig 2006-06-12 09:11:01.000000000 -0400
+++ linux-2.6/net/core/netpoll.c 2006-06-12 13:43:25.000000000 -0400
@@ -54,6 +54,7 @@ static atomic_t trapped;
sizeof(struct iphdr) + sizeof(struct ethhdr))
static void zap_completion_queue(void);
+static void arp_reply(struct sk_buff *skb);
static void queue_process(void *p)
{
@@ -153,8 +154,25 @@ static void poll_napi(struct netpoll *np
}
}
+static void service_arp_queue(struct netpoll_info *npi)
+{
+ struct sk_buff *skb;
+
+ if(unlikely(!npi))
+ return;
+
+ skb = skb_dequeue(&npi->arp_tx);
+
+ while (skb != NULL) {
+ arp_reply(skb);
+ skb = skb_dequeue(&npi->arp_tx);
+ }
+ return;
+}
+
void netpoll_poll(struct netpoll *np)
{
+
if(!np->dev || !netif_running(np->dev) || !np->dev->poll_controller)
return;
@@ -163,6 +181,8 @@ void netpoll_poll(struct netpoll *np)
if (np->dev->poll)
poll_napi(np);
+ service_arp_queue(np->dev->npinfo);
+
zap_completion_queue();
}
@@ -449,7 +469,9 @@ int __netpoll_rx(struct sk_buff *skb)
int proto, len, ulen;
struct iphdr *iph;
struct udphdr *uh;
- struct netpoll *np = skb->dev->npinfo->rx_np;
+ struct netpoll_info *npi = skb->dev->npinfo;
+ struct netpoll *np = npi->rx_np;
+
if (!np)
goto out;
@@ -459,7 +481,7 @@ int __netpoll_rx(struct sk_buff *skb)
/* check if netpoll clients need ARP */
if (skb->protocol == __constant_htons(ETH_P_ARP) &&
atomic_read(&trapped)) {
- arp_reply(skb);
+ skb_queue_tail(&npi->arp_tx, skb);
return 1;
}
@@ -654,6 +676,7 @@ int netpoll_setup(struct netpoll *np)
npinfo->poll_owner = -1;
npinfo->tries = MAX_RETRIES;
spin_lock_init(&npinfo->rx_lock);
+ skb_queue_head_init(&npinfo->arp_tx);
} else
npinfo = ndev->npinfo;
--
/***************************************************
*Neil Horman
*Software Engineer
*gpg keyid: 1024D / 0x92A74FA1 - http://pgp.mit.edu
***************************************************/
^ permalink raw reply
* [PATCH 0/5] d80211: better fragmentation handling
From: Jiri Benc @ 2006-06-12 19:16 UTC (permalink / raw)
To: netdev; +Cc: John W. Linville, Michael Buesch
Following patches allow proper handling of situation when hw queue gets
filled up while sending 802.11 fragments.
This breaks drivers; an example how to fix them is in second patch. Also,
get_tx_stats callback is optional now.
--
Jiri Benc
SUSE Labs
^ permalink raw reply
* [incomplete 2/5] bcm43xx-d80211: per-queue TX flow control
From: Jiri Benc @ 2006-06-12 19:16 UTC (permalink / raw)
To: netdev; +Cc: John W. Linville, Michael Buesch
In-Reply-To: <20060612211454.409884000.midnight@suse.cz>
This is an attempt to fix bcm43xx driver. It is for DMA mode only and
incomplete even for that mode - ieee80211_hw->tx() callback should return
NETDEV_TX_* constants which is not completely fixed by this patch.
---
drivers/net/wireless/d80211/bcm43xx/bcm43xx_dma.c | 6 +++++-
drivers/net/wireless/d80211/bcm43xx/bcm43xx_main.c | 1 +
2 files changed, 6 insertions(+), 1 deletion(-)
--- dscape.orig/drivers/net/wireless/d80211/bcm43xx/bcm43xx_dma.c
+++ dscape/drivers/net/wireless/d80211/bcm43xx/bcm43xx_dma.c
@@ -778,13 +778,16 @@ int bcm43xx_dma_tx(struct bcm43xx_privat
* recognizes if the device queue is full and does
* not send data anymore.
*/
+ ieee80211_stop_queue(bcm->net_dev, 0);
printk(KERN_ERR PFX "DMA queue overflow\n");
- return -ENOMEM;
+ return NETDEV_TX_BUSY;
}
err = dma_tx_fragment(ring, skb, ctl);
if (likely(!err))
ring->nr_tx_packets++;
+ if (free_slots(ring) < SLOTS_PER_PACKET)
+ ieee80211_stop_queue(bcm->net_dev, 0);
return err;
}
@@ -833,6 +836,7 @@ void bcm43xx_dma_handle_xmitstatus(struc
slot = next_slot(ring, slot);
}
bcm->stats.last_tx = jiffies;
+ ieee80211_wake_queue(bcm->net_dev, 0);
}
void bcm43xx_dma_get_tx_stats(struct bcm43xx_private *bcm,
--- dscape.orig/drivers/net/wireless/d80211/bcm43xx/bcm43xx_main.c
+++ dscape/drivers/net/wireless/d80211/bcm43xx/bcm43xx_main.c
@@ -3737,6 +3737,7 @@ static int bcm43xx_init_board(struct bcm
bcm43xx_security_init(bcm);
bcm43xx_measure_channel_change_time(bcm);
ieee80211_update_hw(bcm->net_dev, bcm->ieee);
+ ieee80211_start_queues(bcm->net_dev);
ieee80211_netif_oper(bcm->net_dev, NETIF_ATTACH);
ieee80211_netif_oper(bcm->net_dev, NETIF_START);
ieee80211_netif_oper(bcm->net_dev, NETIF_WAKE);
^ permalink raw reply
* [PATCH 1/5] d80211: per-queue TX flow control
From: Jiri Benc @ 2006-06-12 19:16 UTC (permalink / raw)
To: netdev; +Cc: John W. Linville, Michael Buesch
In-Reply-To: <20060612211454.409884000.midnight@suse.cz>
Currently, before a packet is passed to the driver, the driver is asked
about status of its TX queues (i.e. how many packets are queued in each
queue and how large are queues).
This is different from the way generic networking works in Linux and it
doesn't allow easy implementation of resubmitting fragments to the driver
when the queue gets filled up during transmitting.
This patch changes the stack not to ask driver about queue status but
require driver to do TX flow control.
Please note that this breaks drivers.
Signed-off-by: Jiri Benc <jbenc@suse.cz>
---
include/net/d80211.h | 30 ++++++++++++++++++++++++++++++
net/d80211/ieee80211.c | 27 +++++++++++++++++++++++++++
net/d80211/ieee80211_i.h | 6 ++++++
net/d80211/wme.c | 6 +-----
4 files changed, 64 insertions(+), 5 deletions(-)
--- dscape.orig/include/net/d80211.h
+++ dscape/include/net/d80211.h
@@ -781,6 +781,7 @@ int ieee80211_get_hdrlen(u16 fc);
* netdevices for each hardware device. The low-level driver does not "see"
* these interfaces, so it should use this function to perform netif
* operations on all interface. */
+/* This function is deprecated. */
typedef enum {
NETIF_ATTACH, NETIF_DETACH, NETIF_START, NETIF_STOP, NETIF_WAKE,
NETIF_IS_STOPPED, NETIF_UPDATE_TX_START
@@ -788,6 +789,35 @@ typedef enum {
int ieee80211_netif_oper(struct net_device *dev, Netif_Oper op);
/**
+ * ieee80211_wake_queue - wake specific queue
+ * @dev: pointer to &struct net_device as obtained from
+ * ieee80211_alloc_hw().
+ * @queue: queue number (counted from zero).
+ *
+ * Drivers should use this function instead of netif_wake_queue.
+ */
+void ieee80211_wake_queue(struct net_device *dev, int queue);
+
+/**
+ * ieee80211_stop_queue - stop specific queue
+ * @dev: pointer to &struct net_device as obtained from
+ * ieee80211_alloc_hw().
+ * @queue: queue number (counted from zero).
+ *
+ * Drivers should use this function instead of netif_stop_queue.
+ */
+void ieee80211_stop_queue(struct net_device *dev, int queue);
+
+/**
+ * ieee80211_start_queues - start all queues
+ * @dev: pointer to &struct net_device as obtained from
+ * ieee80211_alloc_hw().
+ *
+ * Drivers should use this function instead of netif_start_queue.
+ */
+void ieee80211_start_queues(struct net_device *dev);
+
+/**
* ieee80211_get_mc_list_item - iteration over items in multicast list
* @dev: pointer to &struct net_device as obtained from
* ieee80211_alloc_hw().
--- dscape.orig/net/d80211/ieee80211.c
+++ dscape/net/d80211/ieee80211.c
@@ -4421,6 +4421,30 @@ int ieee80211_netif_oper(struct net_devi
return 0;
}
+void ieee80211_wake_queue(struct net_device *dev, int queue)
+{
+ struct ieee80211_local *local = dev->ieee80211_ptr;
+
+ if (test_and_clear_bit(IEEE80211_LINK_STATE_XOFF,
+ &local->state[queue]))
+ __netif_schedule(dev);
+}
+
+void ieee80211_stop_queue(struct net_device *dev, int queue)
+{
+ struct ieee80211_local *local = dev->ieee80211_ptr;
+
+ set_bit(IEEE80211_LINK_STATE_XOFF, &local->state[queue]);
+}
+
+void ieee80211_start_queues(struct net_device *dev)
+{
+ struct ieee80211_local *local = dev->ieee80211_ptr;
+ int i;
+
+ for (i = 0; i < local->hw->queues; i++)
+ clear_bit(IEEE80211_LINK_STATE_XOFF, &local->state[i]);
+}
void * ieee80211_dev_hw_data(struct net_device *dev)
{
@@ -4548,6 +4572,9 @@ EXPORT_SYMBOL(ieee80211_tx_status);
EXPORT_SYMBOL(ieee80211_beacon_get);
EXPORT_SYMBOL(ieee80211_get_buffered_bc);
EXPORT_SYMBOL(ieee80211_netif_oper);
+EXPORT_SYMBOL(ieee80211_wake_queue);
+EXPORT_SYMBOL(ieee80211_stop_queue);
+EXPORT_SYMBOL(ieee80211_start_queues);
EXPORT_SYMBOL(ieee80211_dev_hw_data);
EXPORT_SYMBOL(ieee80211_dev_stats);
EXPORT_SYMBOL(ieee80211_get_hw_conf);
--- dscape.orig/net/d80211/ieee80211_i.h
+++ dscape/net/d80211/ieee80211_i.h
@@ -353,6 +353,8 @@ struct ieee80211_local {
struct sta_info *sta_hash[STA_HASH_SIZE];
struct timer_list sta_cleanup;
+ unsigned long state[NUM_TX_DATA_QUEUES];
+
int mc_count; /* total count of multicast entries in all interfaces */
int iff_allmultis, iff_promiscs;
/* number of interfaces with corresponding IFF_ flags */
@@ -514,6 +516,10 @@ struct ieee80211_local {
int user_space_mlme;
};
+enum ieee80211_link_state_t {
+ IEEE80211_LINK_STATE_XOFF = 0,
+};
+
struct sta_attribute {
struct attribute attr;
ssize_t (*show)(const struct sta_info *, char *buf);
--- dscape.orig/net/d80211/wme.c
+++ dscape/net/d80211/wme.c
@@ -316,18 +316,14 @@ static struct sk_buff *wme_qdiscop_deque
struct net_device *dev = qd->dev;
struct ieee80211_local *local = dev->ieee80211_ptr;
struct ieee80211_hw *hw = local->hw;
- struct ieee80211_tx_queue_stats stats;
struct sk_buff *skb;
struct Qdisc *qdisc;
int queue;
- /* find which hardware queues have space in them */
- hw->get_tx_stats(dev, &stats);
-
/* check all the h/w queues in numeric/priority order */
for (queue = 0; queue < hw->queues; queue++) {
/* see if there is room in this hardware queue */
- if (stats.data[queue].len >= stats.data[queue].limit)
+ if (test_bit(IEEE80211_LINK_STATE_XOFF, &local->state[queue]))
continue;
/* there is space - try and get a frame */
^ permalink raw reply
* [PATCH 3/5] d80211: handle full queue when sending fragments
From: Jiri Benc @ 2006-06-12 19:16 UTC (permalink / raw)
To: netdev; +Cc: John W. Linville, Michael Buesch
In-Reply-To: <20060612211454.409884000.midnight@suse.cz>
When the queue gets filled up while sending fragments, do not discard the
frame.
Partially sent frames are stored in a buffer in ieee80211_local (there is
place for one frame for each queue there). When the space in hw queue gets
available again, stored frame for that queue is sent first.
Also, the case when driver returns NETDEV_TX_BUSY is handled properly now.
Signed-off-by: Jiri Benc <jbenc@suse.cz>
---
net/d80211/ieee80211.c | 229 +++++++++++++++++++++++++++++++++++++----------
net/d80211/ieee80211_i.h | 14 ++
net/d80211/wme.c | 5 -
3 files changed, 199 insertions(+), 49 deletions(-)
--- dscape.orig/net/d80211/ieee80211.c
+++ dscape/net/d80211/ieee80211.c
@@ -1153,6 +1153,74 @@ static void inline ieee80211_tx_prepare(
__ieee80211_tx_prepare(tx, skb, dev, control);
}
+static inline int __ieee80211_queue_stopped(struct ieee80211_local *local,
+ int queue)
+{
+ return test_bit(IEEE80211_LINK_STATE_XOFF, &local->state[queue]);
+}
+
+static inline int __ieee80211_queue_pending(struct ieee80211_local *local,
+ int queue)
+{
+ return test_bit(IEEE80211_LINK_STATE_PENDING, &local->state[queue]);
+}
+
+#define IEEE80211_TX_OK 0
+#define IEEE80211_TX_AGAIN 1
+#define IEEE80211_TX_FRAG_AGAIN 2
+
+static int __ieee80211_tx(struct ieee80211_local *local, struct sk_buff *skb,
+ struct ieee80211_txrx_data *tx)
+{
+ struct ieee80211_tx_control *control = tx->u.tx.control;
+ int ret, i;
+
+ if (skb) {
+ ieee80211_dump_frame(local->mdev->name, "TX to low-level driver", skb);
+ ret = local->hw->tx(local->mdev, skb, control);
+ if (ret)
+ return IEEE80211_TX_AGAIN;
+#ifdef IEEE80211_LEDS
+ if (local->tx_led_counter++ == 0) {
+ ieee80211_tx_led(1, local->mdev);
+ }
+#endif /* IEEE80211_LEDS */
+ }
+ if (tx->u.tx.extra_frag) {
+ control->use_rts_cts = 0;
+ control->use_cts_protect = 0;
+ control->clear_dst_mask = 0;
+ for (i = 0; i < tx->u.tx.num_extra_frag; i++) {
+ if (!tx->u.tx.extra_frag[i])
+ continue;
+ if (__ieee80211_queue_stopped(local, control->queue))
+ return IEEE80211_TX_FRAG_AGAIN;
+ if (i == tx->u.tx.num_extra_frag) {
+ control->tx_rate = tx->u.tx.last_frag_hwrate;
+ control->rateidx = tx->u.tx.last_frag_rateidx;
+ control->rate_ctrl_probe =
+ tx->u.tx.probe_last_frag;
+ }
+
+ ieee80211_dump_frame(local->mdev->name,
+ "TX to low-level driver", skb);
+ ret = local->hw->tx(local->mdev, tx->u.tx.extra_frag[i],
+ control);
+ if (ret)
+ return IEEE80211_TX_FRAG_AGAIN;
+#ifdef IEEE80211_LEDS
+ if (local->tx_led_counter++ == 0) {
+ ieee80211_tx_led(1, local->mdev);
+ }
+#endif /* IEEE80211_LEDS */
+ tx->u.tx.extra_frag[i] = NULL;
+ }
+ kfree(tx->u.tx.extra_frag);
+ tx->u.tx.extra_frag = NULL;
+ }
+ return IEEE80211_TX_OK;
+}
+
static int ieee80211_tx(struct net_device *dev, struct sk_buff *skb,
struct ieee80211_tx_control *control, int mgmt)
{
@@ -1163,6 +1231,8 @@ static int ieee80211_tx(struct net_devic
ieee80211_txrx_result res = TXRX_DROP;
int ret, i;
+ WARN_ON(__ieee80211_queue_pending(local, control->queue));
+
if (unlikely(skb->len < 10)) {
dev_kfree_skb(skb);
return 0;
@@ -1193,65 +1263,60 @@ static int ieee80211_tx(struct net_devic
return 0;
}
- ieee80211_dump_frame(local->mdev->name, "TX to low-level driver", skb);
- ret = local->hw->tx(local->mdev, skb, control);
-#ifdef IEEE80211_LEDS
- if (!ret && local->tx_led_counter++ == 0) {
- ieee80211_tx_led(1, dev);
- }
-#endif /* IEEE80211_LEDS */
if (tx.u.tx.extra_frag) {
- if (ret > 0) {
- /* Must free all fragments and return 0 since skb data
- * has been fragmented into multiple buffers.
- * TODO: could free extra fragments and restore skb to
- * the original form since the data is still there and
- * then return nonzero so that Linux netif would
- * retry. */
- goto drop;
- }
-
- skb = NULL; /* skb is now owned by low-level driver */
- control->use_rts_cts = 0;
- control->use_cts_protect = 0;
- control->clear_dst_mask = 0;
for (i = 0; i < tx.u.tx.num_extra_frag; i++) {
int next_len, dur;
struct ieee80211_hdr *hdr =
(struct ieee80211_hdr *)
tx.u.tx.extra_frag[i]->data;
- if (i + 1 < tx.u.tx.num_extra_frag)
+
+ if (i + 1 < tx.u.tx.num_extra_frag) {
next_len = tx.u.tx.extra_frag[i + 1]->len;
- else {
+ } else {
next_len = 0;
tx.u.tx.rate = tx.u.tx.last_frag_rate;
- tx.u.tx.control->tx_rate = tx.u.tx.rate->val;
- tx.u.tx.control->rateidx =
- tx.u.tx.last_frag_rateidx;
- tx.u.tx.control->rate_ctrl_probe =
- tx.u.tx.probe_last_frag;
+ tx.u.tx.last_frag_hwrate = tx.u.tx.rate->val;
}
dur = ieee80211_duration(&tx, 0, next_len);
hdr->duration_id = cpu_to_le16(dur);
-
- ieee80211_dump_frame(local->mdev->name,
- "TX to low-level driver", skb);
- ret = local->hw->tx(local->mdev, tx.u.tx.extra_frag[i],
- control);
- if (ret > 0)
- goto drop;
-#ifdef IEEE80211_LEDS
- if (local->tx_led_counter++ == 0) {
- ieee80211_tx_led(1, dev);
- }
-#endif /* IEEE80211_LEDS */
- tx.u.tx.extra_frag[i] = NULL;
}
- kfree(tx.u.tx.extra_frag);
- }
- if (ret == -1)
- ret = 0;
- return ret;
+ }
+
+retry:
+ ret = __ieee80211_tx(local, skb, &tx);
+ if (ret) {
+ struct ieee80211_tx_stored_packet *store =
+ &local->pending_packet[control->queue];
+
+ if (ret == IEEE80211_TX_FRAG_AGAIN)
+ skb = NULL;
+ set_bit(IEEE80211_LINK_STATE_PENDING,
+ &local->state[control->queue]);
+ smp_mb();
+ /* When the driver gets out of buffers during sending of
+ * fragments and calls ieee80211_stop_queue, there is
+ * a small window between IEEE80211_LINK_STATE_XOFF and
+ * IEEE80211_LINK_STATE_PENDING flags are set. If a buffer
+ * gets available in that window (i.e. driver calls
+ * ieee80211_wake_queue), we would end up with ieee80211_tx
+ * called with IEEE80211_LINK_STATE_PENDING. Prevent this by
+ * continuing transmitting here when that situation is
+ * possible to have happened. */
+ if (!__ieee80211_queue_stopped(local, control->queue)) {
+ clear_bit(IEEE80211_LINK_STATE_PENDING,
+ &local->state[control->queue]);
+ goto retry;
+ }
+ memcpy(&store->control, control,
+ sizeof(struct ieee80211_tx_control));
+ store->skb = skb;
+ store->extra_frag = tx.u.tx.extra_frag;
+ store->num_extra_frag = tx.u.tx.num_extra_frag;
+ store->last_frag_hwrate = tx.u.tx.last_frag_hwrate;
+ store->last_frag_rateidx = tx.u.tx.last_frag_rateidx;
+ store->last_frag_rate_ctrl_probe = tx.u.tx.probe_last_frag;
+ }
+ return 0;
drop:
if (skb)
@@ -1263,6 +1328,62 @@ static int ieee80211_tx(struct net_devic
return 0;
}
+static void ieee80211_tx_pending(unsigned long data)
+{
+ struct ieee80211_local *local = (struct ieee80211_local *)data;
+ struct net_device *dev = local->mdev;
+ struct ieee80211_tx_stored_packet *store;
+ struct ieee80211_txrx_data tx;
+ int i, ret, reschedule = 0;
+
+ spin_lock_bh(&dev->xmit_lock);
+ dev->xmit_lock_owner = smp_processor_id();
+ for (i = 0; i < local->hw->queues; i++) {
+ if (__ieee80211_queue_stopped(local, i))
+ continue;
+ if (!__ieee80211_queue_pending(local, i)) {
+ reschedule = 1;
+ continue;
+ }
+ store = &local->pending_packet[i];
+ tx.u.tx.control = &store->control;
+ tx.u.tx.extra_frag = store->extra_frag;
+ tx.u.tx.num_extra_frag = store->num_extra_frag;
+ tx.u.tx.last_frag_hwrate = store->last_frag_hwrate;
+ tx.u.tx.last_frag_rateidx = store->last_frag_rateidx;
+ tx.u.tx.probe_last_frag = store->last_frag_rate_ctrl_probe;
+ ret = __ieee80211_tx(local, store->skb, &tx);
+ if (ret) {
+ if (ret == IEEE80211_TX_FRAG_AGAIN)
+ store->skb = NULL;
+ } else {
+ clear_bit(IEEE80211_LINK_STATE_PENDING,
+ &local->state[i]);
+ reschedule = 1;
+ }
+ }
+ dev->xmit_lock_owner = -1;
+ spin_unlock_bh(&dev->xmit_lock);
+ if (reschedule)
+ netif_schedule(dev);
+}
+
+static void ieee80211_clear_tx_pending(struct ieee80211_local *local)
+{
+ int i, j;
+ struct ieee80211_tx_stored_packet *store;
+
+ for (i = 0; i < local->hw->queues; i++) {
+ if (!__ieee80211_queue_pending(local, i))
+ continue;
+ store = &local->pending_packet[i];
+ kfree_skb(store->skb);
+ for (j = 0; j < store->num_extra_frag; j++)
+ kfree_skb(store->extra_frag[j]);
+ kfree(store->extra_frag);
+ clear_bit(IEEE80211_LINK_STATE_PENDING, &local->state[i]);
+ }
+}
static int ieee80211_master_start_xmit(struct sk_buff *skb,
struct net_device *dev)
@@ -1999,6 +2120,7 @@ static int ieee80211_master_open(struct
list_for_each_entry(sdata, &local->sub_if_list, list) {
if (sdata->dev != dev && netif_running(sdata->dev)) {
res = 0;
+ tasklet_enable(&local->tx_pending_tasklet);
break;
}
}
@@ -2010,6 +2132,7 @@ static int ieee80211_master_stop(struct
struct ieee80211_local *local = dev->ieee80211_ptr;
struct ieee80211_sub_if_data *sdata;
+ tasklet_disable(&local->tx_pending_tasklet);
list_for_each_entry(sdata, &local->sub_if_list, list) {
if (sdata->dev != dev && netif_running(sdata->dev))
return -EOPNOTSUPP;
@@ -4175,6 +4298,10 @@ struct net_device *ieee80211_alloc_hw(si
sdata->local = local;
list_add_tail(&sdata->list, &local->sub_if_list);
+ tasklet_init(&local->tx_pending_tasklet, ieee80211_tx_pending,
+ (unsigned long)local);
+ tasklet_disable(&local->tx_pending_tasklet);
+
tasklet_init(&local->tasklet,
ieee80211_tasklet_handler,
(unsigned long) local);
@@ -4344,6 +4471,7 @@ void ieee80211_unregister_hw(struct net_
}
rtnl_unlock();
+ ieee80211_clear_tx_pending(local);
sta_info_stop(local);
rate_control_remove_attrs(local, local->rate_ctrl_priv,
&local->class_dev.kobj);
@@ -4426,8 +4554,13 @@ void ieee80211_wake_queue(struct net_dev
struct ieee80211_local *local = dev->ieee80211_ptr;
if (test_and_clear_bit(IEEE80211_LINK_STATE_XOFF,
- &local->state[queue]))
- __netif_schedule(dev);
+ &local->state[queue])) {
+ if (test_bit(IEEE80211_LINK_STATE_PENDING,
+ &local->state[queue]))
+ tasklet_schedule(&local->tx_pending_tasklet);
+ else
+ __netif_schedule(dev);
+ }
}
void ieee80211_stop_queue(struct net_device *dev, int queue)
--- dscape.orig/net/d80211/ieee80211_i.h
+++ dscape/net/d80211/ieee80211_i.h
@@ -125,6 +125,7 @@ struct ieee80211_txrx_data {
* when using CTS protection with IEEE 802.11g. */
struct ieee80211_rate *last_frag_rate;
int last_frag_rateidx;
+ int last_frag_hwrate;
int mgmt_interface;
/* Extra fragments (in addition to the first fragment
@@ -155,6 +156,16 @@ struct ieee80211_tx_packet_data {
unsigned int mgmt_iface:1;
};
+struct ieee80211_tx_stored_packet {
+ struct ieee80211_tx_control control;
+ struct sk_buff *skb;
+ int num_extra_frag;
+ struct sk_buff **extra_frag;
+ int last_frag_rateidx;
+ int last_frag_hwrate;
+ unsigned int last_frag_rate_ctrl_probe:1;
+};
+
struct ieee80211_passive_scan {
unsigned int in_scan:1; /* this must be cleared before calling
* netif_oper(WAKEUP) */
@@ -354,6 +365,8 @@ struct ieee80211_local {
struct timer_list sta_cleanup;
unsigned long state[NUM_TX_DATA_QUEUES];
+ struct ieee80211_tx_stored_packet pending_packet[NUM_TX_DATA_QUEUES];
+ struct tasklet_struct tx_pending_tasklet;
int mc_count; /* total count of multicast entries in all interfaces */
int iff_allmultis, iff_promiscs;
@@ -518,6 +531,7 @@ struct ieee80211_local {
enum ieee80211_link_state_t {
IEEE80211_LINK_STATE_XOFF = 0,
+ IEEE80211_LINK_STATE_PENDING,
};
struct sta_attribute {
--- dscape.orig/net/d80211/wme.c
+++ dscape/net/d80211/wme.c
@@ -323,7 +323,10 @@ static struct sk_buff *wme_qdiscop_deque
/* check all the h/w queues in numeric/priority order */
for (queue = 0; queue < hw->queues; queue++) {
/* see if there is room in this hardware queue */
- if (test_bit(IEEE80211_LINK_STATE_XOFF, &local->state[queue]))
+ if (test_bit(IEEE80211_LINK_STATE_XOFF,
+ &local->state[queue]) ||
+ test_bit(IEEE80211_LINK_STATE_PENDING,
+ &local->state[queue]))
continue;
/* there is space - try and get a frame */
^ permalink raw reply
* [PATCH 4/5] d80211: add first_fragment flag to ieee80211_tx_control
From: Jiri Benc @ 2006-06-12 19:16 UTC (permalink / raw)
To: netdev; +Cc: John W. Linville, Michael Buesch
In-Reply-To: <20060612211454.409884000.midnight@suse.cz>
If a driver needs to find out if the fragment it is supposed to pass to the
hardware is the first fragment, the only way to do this is to check if
a Fragment Number part of seq_ctrl field in the frame header equals to 0.
Let's make it easier.
Signed-off-by: Jiri Benc <jbenc@suse.cz>
---
include/net/d80211.h | 2 ++
net/d80211/ieee80211.c | 2 ++
2 files changed, 4 insertions(+)
--- dscape.orig/include/net/d80211.h
+++ dscape/include/net/d80211.h
@@ -158,6 +158,8 @@ struct ieee80211_tx_control {
unsigned int rate_ctrl_probe:1;
unsigned int clear_dst_mask:1;
unsigned int requeue:1;
+ unsigned int first_fragment:1; /* This is a first fragment of the
+ * frame */
/* following three flags are only used with Atheros Super A/G */
unsigned int compress:1;
unsigned int turbo_prime_notify:1; /* notify HostaAPd after frame
--- dscape.orig/net/d80211/ieee80211.c
+++ dscape/net/d80211/ieee80211.c
@@ -1120,6 +1120,7 @@ __ieee80211_tx_prepare(struct ieee80211_
u8 *pos = &skb->data[hdrlen + sizeof(rfc1042_header)];
tx->ethertype = (pos[0] << 8) | pos[1];
}
+ control->first_fragment = 1;
}
@@ -1190,6 +1191,7 @@ static int __ieee80211_tx(struct ieee802
control->use_rts_cts = 0;
control->use_cts_protect = 0;
control->clear_dst_mask = 0;
+ control->first_fragment = 0;
for (i = 0; i < tx->u.tx.num_extra_frag; i++) {
if (!tx->u.tx.extra_frag[i])
continue;
^ permalink raw reply
* [PATCH 5/5] bcm43xx-d80211: fix sending of fragments
From: Jiri Benc @ 2006-06-12 19:16 UTC (permalink / raw)
To: netdev; +Cc: John W. Linville, Michael Buesch
In-Reply-To: <20060612211454.409884000.midnight@suse.cz>
This makes fragmentation work with bcm43xx.
Signed-off-by: Jiri Benc <jbenc@suse.cz>
---
drivers/net/wireless/d80211/bcm43xx/bcm43xx_dma.c | 2 +-
drivers/net/wireless/d80211/bcm43xx/bcm43xx_pio.c | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
--- dscape.orig/drivers/net/wireless/d80211/bcm43xx/bcm43xx_dma.c
+++ dscape/drivers/net/wireless/d80211/bcm43xx/bcm43xx_dma.c
@@ -703,7 +703,7 @@ static int dma_tx_fragment(struct bcm43x
bcm43xx_generate_txhdr(ring->bcm,
(struct bcm43xx_txhdr *)hdr_skb->data,
skb->data, skb->len,
- 1,//FIXME
+ ctl->first_fragment,
generate_cookie(ring, slot),
ctl);
--- dscape.orig/drivers/net/wireless/d80211/bcm43xx/bcm43xx_pio.c
+++ dscape/drivers/net/wireless/d80211/bcm43xx/bcm43xx_pio.c
@@ -183,7 +183,7 @@ static void pio_tx_write_fragment(struct
assert(skb_shinfo(skb)->nr_frags == 0);
bcm43xx_generate_txhdr(queue->bcm,
&txhdr, skb->data, skb->len,
- 1,//FIXME
+ packet->ctl->first_fragment,
generate_cookie(queue, pio_txpacket_getindex(packet)),
packet->ctl);
^ permalink raw reply
* [PATCH] Make in-kernel hostap less annoying
From: Kyle McMartin @ 2006-06-12 19:13 UTC (permalink / raw)
To: jkmaline; +Cc: netdev
Most user don't want their kern.log/dmesg filled with
debugging gibberish, and could turn it on if prompted.
( Example:
wifi0: TXEXC - status=0x0004 ([Discon]) tx_control=000c
retry_count=0 tx_rate=0 fc=0x0108 (Data::0 ToDS)
A1=00:0f:66:43:d7:0a A2=00:05:3c:06:63:01 A3=33:33:00:00:00:16
A4=00:00:00:00:00:00 )
Also make hostap default to managed mode, instead of master mode, which
has bitten a few users expecting it to behave like the orinoco driver
it is replacing.
Signed-off-by: Kyle McMartin <kyle@parisc-linux.org>
---
Two minor things I've been carrying around in my personal tree
for quite some time. (This is only relevant to the in-kernel driver,
I see no reason to change the out-of-tree driver.)
Cheers,
Kyle
diff --git a/drivers/net/wireless/hostap/hostap_config.h b/drivers/net/wireless/hostap/hostap_config.h
index c090a5a..bc51fa9 100644
--- a/drivers/net/wireless/hostap/hostap_config.h
+++ b/drivers/net/wireless/hostap/hostap_config.h
@@ -38,7 +38,7 @@ #endif
*/
/* Do not include debug messages into the driver */
-/* #define PRISM2_NO_DEBUG */
+#define PRISM2_NO_DEBUG
/* Do not include /proc/net/prism2/wlan#/{registers,debug} */
/* #define PRISM2_NO_PROCFS_DEBUG */
diff --git a/drivers/net/wireless/hostap/hostap_hw.c b/drivers/net/wireless/hostap/hostap_hw.c
index 328e9a1..57438e8 100644
--- a/drivers/net/wireless/hostap/hostap_hw.c
+++ b/drivers/net/wireless/hostap/hostap_hw.c
@@ -70,7 +70,7 @@ static char essid[33] = "test";
module_param_string(essid, essid, sizeof(essid), 0444);
MODULE_PARM_DESC(essid, "Host AP's ESSID");
-static int iw_mode[MAX_PARM_DEVICES] = { IW_MODE_MASTER, DEF_INTS };
+static int iw_mode[MAX_PARM_DEVICES] = { IW_MODE_INFRA, DEF_INTS };
module_param_array(iw_mode, int, NULL, 0444);
MODULE_PARM_DESC(iw_mode, "Initial operation mode");
^ permalink raw reply related
* Re: [PATCH 3/12] d80211: separate allocation of ieee80211_local
From: Jiri Benc @ 2006-06-12 19:35 UTC (permalink / raw)
To: David S. Miller; +Cc: netdev, John W. Linville
In-Reply-To: <20060608074907.2CB5B48391@silver.suse.cz>
On Thu, 8 Jun 2006 09:49:07 +0200 (CEST), Jiri Benc wrote:
> ieee80211_local has a separate class_device. That means it has reference
> counting independent of master net_device and can be freed at a different
> time, therefore these two structures cannot be allocated together.
>
> Solve this by adding ieee80211_ptr pointer to net_device structure (similar
> to other pointers already presented there) and using it as a pointer to
> independently allocated ieee80211_local.
I suppose approval from Dave will be needed for adding that pointer to
net_device, right?
> [...]
> include/linux/netdevice.h | 1
> net/d80211/ieee80211.c | 100 +++++++++++++++++++++---------------------
> net/d80211/ieee80211_dev.c | 17 +++++++
> net/d80211/ieee80211_i.h | 9 +++-
> net/d80211/ieee80211_iface.c | 20 ++++----
> net/d80211/ieee80211_ioctl.c | 92 +++++++++++++++++++--------------------
> net/d80211/ieee80211_proc.c | 6 +--
> net/d80211/ieee80211_scan.c | 10 ++--
> net/d80211/ieee80211_sta.c | 58 ++++++++++++------------
> net/d80211/ieee80211_sysfs.c | 26 ++++++++---
> net/d80211/rate_control.c | 4 +-
> net/d80211/rate_control.h | 4 +-
> net/d80211/wme.c | 26 +++++------
> 13 files changed, 206 insertions(+), 167 deletions(-)
>
> [...]
> --- a/include/linux/netdevice.h
> +++ b/include/linux/netdevice.h
> @@ -371,6 +371,7 @@ #define NETIF_F_UFO 8192
> void *ip6_ptr; /* IPv6 specific data */
> void *ec_ptr; /* Econet specific data */
> void *ax25_ptr; /* AX.25 specific data */
> + void *ieee80211_ptr; /* IEEE 802.11 specific data */
>
> /*
> * Cache line mostly used on receive path (including eth_type_trans())
> [...]
Thanks,
--
Jiri Benc
SUSE Labs
^ permalink raw reply
* Re: [PATCH 5/5] bcm43xx-d80211: fix sending of fragments
From: Michael Buesch @ 2006-06-12 19:35 UTC (permalink / raw)
To: Jiri Benc; +Cc: John W. Linville, netdev
In-Reply-To: <20060612191606.7AA8E48391@silver.suse.cz>
On Monday 12 June 2006 21:16, Jiri Benc wrote:
> This makes fragmentation work with bcm43xx.
>
> Signed-off-by: Jiri Benc <jbenc@suse.cz>
Signed-off-by: Michael Buesch <mb@bu3sch.de>
The other patch will get my sign-off tomorrow (I think modified, though).
I don't have time to look at it more close, now.
> ---
> drivers/net/wireless/d80211/bcm43xx/bcm43xx_dma.c | 2 +-
> drivers/net/wireless/d80211/bcm43xx/bcm43xx_pio.c | 2 +-
> 2 files changed, 2 insertions(+), 2 deletions(-)
>
> --- dscape.orig/drivers/net/wireless/d80211/bcm43xx/bcm43xx_dma.c
> +++ dscape/drivers/net/wireless/d80211/bcm43xx/bcm43xx_dma.c
> @@ -703,7 +703,7 @@ static int dma_tx_fragment(struct bcm43x
> bcm43xx_generate_txhdr(ring->bcm,
> (struct bcm43xx_txhdr *)hdr_skb->data,
> skb->data, skb->len,
> - 1,//FIXME
> + ctl->first_fragment,
> generate_cookie(ring, slot),
> ctl);
>
> --- dscape.orig/drivers/net/wireless/d80211/bcm43xx/bcm43xx_pio.c
> +++ dscape/drivers/net/wireless/d80211/bcm43xx/bcm43xx_pio.c
> @@ -183,7 +183,7 @@ static void pio_tx_write_fragment(struct
> assert(skb_shinfo(skb)->nr_frags == 0);
> bcm43xx_generate_txhdr(queue->bcm,
> &txhdr, skb->data, skb->len,
> - 1,//FIXME
> + packet->ctl->first_fragment,
> generate_cookie(queue, pio_txpacket_getindex(packet)),
> packet->ctl);
>
>
--
Greetings Michael.
^ permalink raw reply
* Re: [PATCH 3/12] d80211: separate allocation of ieee80211_local
From: John W. Linville @ 2006-06-12 19:52 UTC (permalink / raw)
To: Jiri Benc; +Cc: David S. Miller, netdev
In-Reply-To: <20060612213523.473a9714@griffin.suse.cz>
On Mon, Jun 12, 2006 at 09:35:23PM +0200, Jiri Benc wrote:
> On Thu, 8 Jun 2006 09:49:07 +0200 (CEST), Jiri Benc wrote:
> > ieee80211_local has a separate class_device. That means it has reference
> > counting independent of master net_device and can be freed at a different
> > time, therefore these two structures cannot be allocated together.
> >
> > Solve this by adding ieee80211_ptr pointer to net_device structure (similar
> > to other pointers already presented there) and using it as a pointer to
> > independently allocated ieee80211_local.
>
> I suppose approval from Dave will be needed for adding that pointer to
> net_device, right?
Ulitmately, yes. :-)
John
--
John W. Linville
linville@tuxdriver.com
^ permalink raw reply
* Re: [patch] undo AF_UNIX _bh locking changes and split lock-type instead
From: David Miller @ 2006-06-12 20:08 UTC (permalink / raw)
To: mingo
Cc: akpm, Valdis.Kletnieks, herbert, netdev, linux-kernel, stefanr,
jirislaby, linux1394-devel, mingo, arjan
In-Reply-To: <20060612084936.GA29516@elte.hu>
From: Ingo Molnar <mingo@elte.hu>
Date: Mon, 12 Jun 2006 10:49:36 +0200
> Subject: undo AF_UNIX _bh locking changes and split lock-type
> From: Ingo Molnar <mingo@elte.hu>
>
> this cleans up lock-validator-special-locking-af_unix.patch: instead
> of adding _bh locking to AF_UNIX, this patch splits their
> sk_receive_queue.lock type from the other networking skb-queue locks.
>
> Signed-off-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: David S. Miller <davem@davemloft.net>
^ permalink raw reply
* Re: MIB "ipInHdrErrors" error
From: David Miller @ 2006-06-12 20:10 UTC (permalink / raw)
To: weid; +Cc: netdev
In-Reply-To: <1150102163.2974.9.camel@L-tech>
From: Wei Dong <weid@nanjing-fnst.com>
Date: Mon, 12 Jun 2006 16:49:23 +0800
> On Mon, 2006-06-12 at 15:24 +0800, Wei Dong wrote:
> > > Also, when kernel receives an IP packet and need to forward, but
> > > TTL=1 or TTL=0, kernel just sends an ICMP packet to inform the
> > > sender TTL count exceeded, and doesn't increase this counter.
> >
> > This part of your change seems correct, please just resubmit
> > this part.
> The following is the latest patch for MIB ipIHdrErrors.
Patch applied, thanks a lot.
^ permalink raw reply
* Your future, mortgage broker
From: Leah Horner @ 2006-06-12 20:18 UTC (permalink / raw)
To: netdev
Even if you have no erectin problems SOFT CIAzLIS
would help you to make BETTER SE X MORE OFTEN!
and to bring unimagnable plesure to her.
Just disolve half a pil under your tongue
and get ready for action in 15 minutes.
The tests showed that the majority of men
after taking this medic ation were able to have
PERFECT ER ECTI ON during 36 hours!
VISIT US, AND GET OUR SPECIAL 70% DISC OUNT OFER!
http://hlbeuu.mistnear.net/?23325044
==========
Gray-feathered backs were turned upon Jonathan from that moment onward,
spot. To be honest, I could have gotten by with seven, but I threw one just
at the base of the cliff, in the center of the whole Flock assembled.
used to be the town dump was under us. And I felt a light breeze. Except
when I'm going to appear out of thin air on your beach, and show you a
discoveries--that's not my field."
on the join-up..."
the whole thing-just emptiness and more emptiness, thin air. And for all
^ permalink raw reply
* New Qlogic qla3xxx NIC Driver v2.02.00k31 for upstream inclusion
From: Ron Mercer @ 2006-06-12 20:33 UTC (permalink / raw)
To: jeff; +Cc: linux-driver, netdev
Jeff,
Please find the Qlogic qla3xxx Ethernet driver posted at the URL below.
This is a complementary network driver for our ISP4XXX parts.
There is a concurrent effort underway to get the iSCSI driver (qla4xxx)
integrated upstream as well.
I have been through several iterations with the linux-netdev list and
have had much response from Stephen Hemminger. In his last response he
suggested I submit the driver to you.
This submission is contained in a patch file that does the following:
Adds:
drivers/net/qla3xxx.c
drivers/net/qla3xxx.h
Modifies:
MAINTAINERS
drivers/net/Makefile
drivers/net/Kconfig
Patch file qla3xxxpatch1-v2.02.00-k31.txt is at the following link:
ftp://ftp.qlogic.com/outgoing/linux/network/upstream/2.02.00k31/qla3xxxp
atch1-v2.02.00-k31.txt
Some notes on the driver/hardware:
- Built and tested using kernel 2.6.17-rc4.
- The chip supports two ethernet and two iSCSI functions.
- The functions ql_sem_lock, ql_sem_spinlock, ql_sem_unlock, and
ql_wait_for_drvr_lock are used to protect resources that are shared
across the network and iSCSI functions. This protection is mostly
during chip initialization and resets, but also include link management.
- The PHY/MII are not exported through ethtool due to the fact that the
iSCSI function will control the common link at least 50% of the time.
Regards,
Ron Mercer
Qlogic Corporation
^ permalink raw reply
* Re: [PATCH 2.6.17-rc6] Remove Prism II support from Orinoco
From: Dave Jones @ 2006-06-12 20:55 UTC (permalink / raw)
To: Faidon Liambotis; +Cc: John W. Linville, netdev, proski, hermes
In-Reply-To: <20060612153958.GA6719@divinity>
On Mon, Jun 12, 2006 at 06:39:58PM +0300, Faidon Liambotis wrote:
> FWIW, I think we've experienced a similar situation like this in the
> past in the networking land and the consensus was to completely remove
> the other driver. I'm referring to e100/eepro100, of course.
The difference with e100/eepro100, was that there the interface
name remained constant regardless of which driver you were using,
which isn't the case with orinoco->hostap.
Dave
--
http://www.codemonkey.org.uk
^ permalink raw reply
* Re: [PATCH RFC] netpoll: don't spin forever sending to stopped queues
From: Jeremy Fitzhardinge @ 2006-06-12 20:57 UTC (permalink / raw)
To: Matt Mackall; +Cc: Linux Kernel Mailing List, netdev
In-Reply-To: <20060611200407.GG24227@waste.org>
Matt Mackall wrote:
> On Thu, Jun 08, 2006 at 07:15:50PM -0700, Jeremy Fitzhardinge wrote:
>
>> Here's a patch. I haven't tested it beyond compiling it, and I don't
>> know if it is actually correct. In this case, it seems pointless to
>> spin waiting for an even which will never happen. Should
>> netif_poll_disable() cause netpoll_send_skb() (or something) to not even
>> bother trying to send? netif_poll_disable seems mysteriously simple to me.
>>
>> J
>>
>
> Did this work for you at all?
>
No, it didn't appear to help; I get the same symptom. I think fix is
correct (in that its better than what was there before), but there's
probably more going on in my case. I haven't looked into it more deeply
yet. I suspect there's another netpoll code path which is spinning
forever on an XOFFed queue.
>> When transmitting a skb in netpoll_send_skb(), only retry a limited
>> number of times if the device queue is stopped.
>>
>
> Where limited = once?
>
No, it reuses the existing retry logic. It retries 20000 times with a
50us pause between attempts, so up to a second. This seems excessive to
me; I don't know where those original numbers came from. I tried 5000
retries, but it didn't make any difference to my case.
J
^ permalink raw reply
* Re: [PATCH RFC] netpoll: don't spin forever sending to stopped queues
From: Matt Mackall @ 2006-06-12 20:53 UTC (permalink / raw)
To: Jeremy Fitzhardinge; +Cc: Linux Kernel Mailing List, netdev
In-Reply-To: <448DD556.6030705@goop.org>
On Mon, Jun 12, 2006 at 01:57:58PM -0700, Jeremy Fitzhardinge wrote:
> Matt Mackall wrote:
> >On Thu, Jun 08, 2006 at 07:15:50PM -0700, Jeremy Fitzhardinge wrote:
> >
> >>Here's a patch. I haven't tested it beyond compiling it, and I don't
> >>know if it is actually correct. In this case, it seems pointless to
> >>spin waiting for an even which will never happen. Should
> >>netif_poll_disable() cause netpoll_send_skb() (or something) to not even
> >>bother trying to send? netif_poll_disable seems mysteriously simple to
> >>me.
> >>
> >> J
> >>
> >
> >Did this work for you at all?
> >
>
> No, it didn't appear to help; I get the same symptom. I think fix is
> correct (in that its better than what was there before), but there's
> probably more going on in my case. I haven't looked into it more deeply
> yet. I suspect there's another netpoll code path which is spinning
> forever on an XOFFed queue.
>
> >>When transmitting a skb in netpoll_send_skb(), only retry a limited
> >>number of times if the device queue is stopped.
> >>
> >
> >Where limited = once?
> >
>
> No, it reuses the existing retry logic. It retries 20000 times with a
> 50us pause between attempts, so up to a second. This seems excessive to
> me; I don't know where those original numbers came from. I tried 5000
> retries, but it didn't make any difference to my case.
Ahh, right. I forgot that I'd done that. Can you resend?
--
Mathematics is the supreme nostalgia of our time.
^ permalink raw reply
* Re: [PATCH RFC] netpoll: don't spin forever sending to stopped queues
From: Jeremy Fitzhardinge @ 2006-06-12 21:20 UTC (permalink / raw)
To: Matt Mackall; +Cc: Linux Kernel Mailing List, netdev
In-Reply-To: <20060612205310.GU24227@waste.org>
Matt Mackall wrote:
> Ahh, right. I forgot that I'd done that. Can you resend?
>
I just respun it against 2.6.17-rc6-mm2.
J
--
Subject: netpoll: don't spin forever sending to blocked queues
When transmitting a skb in netpoll_send_skb(), only retry a limited
number of times if the device queue is stopped.
Signed-off-by: Jeremy Fitzhardinge <jeremy@goop.org>
diff -r 0b8d3d4ee182 net/core/netpoll.c
--- a/net/core/netpoll.c Mon Jun 12 13:46:23 2006 -0700
+++ b/net/core/netpoll.c Mon Jun 12 13:48:34 2006 -0700
@@ -279,14 +279,10 @@ static void netpoll_send_skb(struct netp
* network drivers do not expect to be called if the queue is
* stopped.
*/
- if (netif_queue_stopped(np->dev)) {
- netif_tx_unlock(np->dev);
- netpoll_poll(np);
- udelay(50);
- continue;
- }
-
- status = np->dev->hard_start_xmit(skb, np->dev);
+ status = NETDEV_TX_BUSY;
+ if (!netif_queue_stopped(np->dev))
+ status = np->dev->hard_start_xmit(skb, np->dev);
+
netif_tx_unlock(np->dev);
/* success */
^ permalink raw reply
* Re: Using netconsole for debugging suspend/resume
From: Jeremy Fitzhardinge @ 2006-06-12 21:25 UTC (permalink / raw)
To: Andi Kleen; +Cc: Mark Lord, Matt Mackall, Linux Kernel Mailing List, netdev
In-Reply-To: <200606121746.34880.ak@suse.de>
Andi Kleen wrote:
> On Monday 12 June 2006 17:38, Mark Lord wrote:
>
>> Okay, so I'm daft. But.. *what* is "it" ??
>>
>> We have two machines: target (being debugged), and host (anything).
>> Sure, the target has to have ohci1394 loaded, and firescope running.
>> But what about the *other* end of the connection? What commands?
>>
>
> From the same manpage:
> "The raw1394 module must be loaded and its device node
> be writable (this normally requires root)"
>
> Ok it doesn't say you need ohci1394 too and doesn't say that's the target.
> If I do a new revision I'll perhaps expand the docs a bit.
>
> So load ohci1394/raw1394 and run firescope as root. Your distribution
> will hopefully take care of the device nodes. Usually you want
> something like firescope -Au System.map
>
I think the confusion here is that the target doesn't need to be running
anything; you can DMA chunks of memory with the OHCI controller with no
need for any software support. The debugger host is what's running
firescope.
Unless I'm confused too, which is likely. Andi, I think your docs
should be more explicit about what runs where.
Also, the tricky bit for me is debugging resume; firescope still
requires the OHCI device to come up to be useful, but I that's no
different from using netconsole.
Neat stuff; I need to get my two firewire-enabled machines close enough
to each other to try it out.
J
^ permalink raw reply
* Hi, milo maize
From: Myrna Pereira @ 2006-06-12 22:11 UTC (permalink / raw)
To: netdev
Join and Play at the best Emperial zCASINOz!
As a Special Welcome TODAY, we will DOUBL your 1 Deposit up to 200 bucks!
For example:
Deposit 50 play with 100!
Deposit 100 play with 200!
And your FREE Bonuses will be INSTANTLY added to your acount!
Try us, inhere:
http://EBR7I3.erprost.com/d1/today
==========
inverted spin, the gull bunt, the pinwheel.
unscrewed the cap, and attached myself to it like a lamprey. I sat on the
Then one day Jonathan, standing on the shore, closing his eyes,
hours unless he can answer this question: 'How do you know you're sane?' ";
Tender.
==
Still, it was easier for them to practice high performance than it
He spread out the map on the windowsill, leaned on his hands, and bent
"Why is it," Jonathan puzzled, "that the hardest thing in the world
==
"Not bad. And you?" He didn't answer. He hugged my neck, pressed me to
The squawks and grockles of everyday life in the Flock were cut off
I kicked him in his bare can and dove into my stall and locked the
^ permalink raw reply
page: next (older) | prev (newer) | latest
- recent:[subjects (threaded)|topics (new)|topics (active)]
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox