Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
This commit is contained in:
commit
92b4522f72
@ -97,8 +97,10 @@ static int write_reg(struct hfcsusb *hw, __u8 reg, __u8 val)
|
|||||||
hw->name, __func__, reg, val);
|
hw->name, __func__, reg, val);
|
||||||
|
|
||||||
spin_lock(&hw->ctrl_lock);
|
spin_lock(&hw->ctrl_lock);
|
||||||
if (hw->ctrl_cnt >= HFC_CTRL_BUFSIZE)
|
if (hw->ctrl_cnt >= HFC_CTRL_BUFSIZE) {
|
||||||
|
spin_unlock(&hw->ctrl_lock);
|
||||||
return 1;
|
return 1;
|
||||||
|
}
|
||||||
buf = &hw->ctrl_buff[hw->ctrl_in_idx];
|
buf = &hw->ctrl_buff[hw->ctrl_in_idx];
|
||||||
buf->hfcs_reg = reg;
|
buf->hfcs_reg = reg;
|
||||||
buf->reg_val = val;
|
buf->reg_val = val;
|
||||||
|
@ -1429,7 +1429,7 @@ int be_cmd_write_flashrom(struct be_adapter *adapter, struct be_dma_mem *cmd,
|
|||||||
wrb = wrb_from_mccq(adapter);
|
wrb = wrb_from_mccq(adapter);
|
||||||
if (!wrb) {
|
if (!wrb) {
|
||||||
status = -EBUSY;
|
status = -EBUSY;
|
||||||
goto err;
|
goto err_unlock;
|
||||||
}
|
}
|
||||||
req = cmd->va;
|
req = cmd->va;
|
||||||
sge = nonembedded_sgl(wrb);
|
sge = nonembedded_sgl(wrb);
|
||||||
@ -1457,7 +1457,10 @@ int be_cmd_write_flashrom(struct be_adapter *adapter, struct be_dma_mem *cmd,
|
|||||||
else
|
else
|
||||||
status = adapter->flash_status;
|
status = adapter->flash_status;
|
||||||
|
|
||||||
err:
|
return status;
|
||||||
|
|
||||||
|
err_unlock:
|
||||||
|
spin_unlock_bh(&adapter->mcc_lock);
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1497,7 +1500,7 @@ err:
|
|||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
extern int be_cmd_enable_magic_wol(struct be_adapter *adapter, u8 *mac,
|
int be_cmd_enable_magic_wol(struct be_adapter *adapter, u8 *mac,
|
||||||
struct be_dma_mem *nonemb_cmd)
|
struct be_dma_mem *nonemb_cmd)
|
||||||
{
|
{
|
||||||
struct be_mcc_wrb *wrb;
|
struct be_mcc_wrb *wrb;
|
||||||
@ -1662,7 +1665,7 @@ err:
|
|||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
extern int be_cmd_get_seeprom_data(struct be_adapter *adapter,
|
int be_cmd_get_seeprom_data(struct be_adapter *adapter,
|
||||||
struct be_dma_mem *nonemb_cmd)
|
struct be_dma_mem *nonemb_cmd)
|
||||||
{
|
{
|
||||||
struct be_mcc_wrb *wrb;
|
struct be_mcc_wrb *wrb;
|
||||||
|
@ -504,17 +504,54 @@ static int get_regs_len(struct net_device *dev)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Some transmit errors cause the transmitter to shut
|
/* Some transmit errors cause the transmitter to shut
|
||||||
* down. We now issue a restart transmit. Since the
|
* down. We now issue a restart transmit.
|
||||||
* errors close the BD and update the pointers, the restart
|
* Also, to workaround 8260 device erratum CPM37, we must
|
||||||
* _should_ pick up without having to reset any of our
|
* disable and then re-enable the transmitterfollowing a
|
||||||
* pointers either. Also, To workaround 8260 device erratum
|
* Late Collision, Underrun, or Retry Limit error.
|
||||||
* CPM37, we must disable and then re-enable the transmitter
|
* In addition, tbptr may point beyond BDs beyond still marked
|
||||||
* following a Late Collision, Underrun, or Retry Limit error.
|
* as ready due to internal pipelining, so we need to look back
|
||||||
|
* through the BDs and adjust tbptr to point to the last BD
|
||||||
|
* marked as ready. This may result in some buffers being
|
||||||
|
* retransmitted.
|
||||||
*/
|
*/
|
||||||
static void tx_restart(struct net_device *dev)
|
static void tx_restart(struct net_device *dev)
|
||||||
{
|
{
|
||||||
struct fs_enet_private *fep = netdev_priv(dev);
|
struct fs_enet_private *fep = netdev_priv(dev);
|
||||||
fcc_t __iomem *fccp = fep->fcc.fccp;
|
fcc_t __iomem *fccp = fep->fcc.fccp;
|
||||||
|
const struct fs_platform_info *fpi = fep->fpi;
|
||||||
|
fcc_enet_t __iomem *ep = fep->fcc.ep;
|
||||||
|
cbd_t __iomem *curr_tbptr;
|
||||||
|
cbd_t __iomem *recheck_bd;
|
||||||
|
cbd_t __iomem *prev_bd;
|
||||||
|
cbd_t __iomem *last_tx_bd;
|
||||||
|
|
||||||
|
last_tx_bd = fep->tx_bd_base + (fpi->tx_ring * sizeof(cbd_t));
|
||||||
|
|
||||||
|
/* get the current bd held in TBPTR and scan back from this point */
|
||||||
|
recheck_bd = curr_tbptr = (cbd_t __iomem *)
|
||||||
|
((R32(ep, fen_genfcc.fcc_tbptr) - fep->ring_mem_addr) +
|
||||||
|
fep->ring_base);
|
||||||
|
|
||||||
|
prev_bd = (recheck_bd == fep->tx_bd_base) ? last_tx_bd : recheck_bd - 1;
|
||||||
|
|
||||||
|
/* Move through the bds in reverse, look for the earliest buffer
|
||||||
|
* that is not ready. Adjust TBPTR to the following buffer */
|
||||||
|
while ((CBDR_SC(prev_bd) & BD_ENET_TX_READY) != 0) {
|
||||||
|
/* Go back one buffer */
|
||||||
|
recheck_bd = prev_bd;
|
||||||
|
|
||||||
|
/* update the previous buffer */
|
||||||
|
prev_bd = (prev_bd == fep->tx_bd_base) ? last_tx_bd : prev_bd - 1;
|
||||||
|
|
||||||
|
/* We should never see all bds marked as ready, check anyway */
|
||||||
|
if (recheck_bd == curr_tbptr)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
/* Now update the TBPTR and dirty flag to the current buffer */
|
||||||
|
W32(ep, fen_genfcc.fcc_tbptr,
|
||||||
|
(uint) (((void *)recheck_bd - fep->ring_base) +
|
||||||
|
fep->ring_mem_addr));
|
||||||
|
fep->dirty_tx = recheck_bd;
|
||||||
|
|
||||||
C32(fccp, fcc_gfmr, FCC_GFMR_ENT);
|
C32(fccp, fcc_gfmr, FCC_GFMR_ENT);
|
||||||
udelay(10);
|
udelay(10);
|
||||||
|
@ -739,17 +739,27 @@ err_out:
|
|||||||
static void ar9170_usb_firmware_failed(struct ar9170_usb *aru)
|
static void ar9170_usb_firmware_failed(struct ar9170_usb *aru)
|
||||||
{
|
{
|
||||||
struct device *parent = aru->udev->dev.parent;
|
struct device *parent = aru->udev->dev.parent;
|
||||||
|
struct usb_device *udev;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Store a copy of the usb_device pointer locally.
|
||||||
|
* This is because device_release_driver initiates
|
||||||
|
* ar9170_usb_disconnect, which in turn frees our
|
||||||
|
* driver context (aru).
|
||||||
|
*/
|
||||||
|
udev = aru->udev;
|
||||||
|
|
||||||
complete(&aru->firmware_loading_complete);
|
complete(&aru->firmware_loading_complete);
|
||||||
|
|
||||||
/* unbind anything failed */
|
/* unbind anything failed */
|
||||||
if (parent)
|
if (parent)
|
||||||
device_lock(parent);
|
device_lock(parent);
|
||||||
device_release_driver(&aru->udev->dev);
|
|
||||||
|
device_release_driver(&udev->dev);
|
||||||
if (parent)
|
if (parent)
|
||||||
device_unlock(parent);
|
device_unlock(parent);
|
||||||
|
|
||||||
usb_put_dev(aru->udev);
|
usb_put_dev(udev);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ar9170_usb_firmware_finish(const struct firmware *fw, void *context)
|
static void ar9170_usb_firmware_finish(const struct firmware *fw, void *context)
|
||||||
|
@ -1198,7 +1198,7 @@ void ath_drain_all_txq(struct ath_softc *sc, bool retry_tx)
|
|||||||
int r;
|
int r;
|
||||||
|
|
||||||
ath_print(common, ATH_DBG_FATAL,
|
ath_print(common, ATH_DBG_FATAL,
|
||||||
"Unable to stop TxDMA. Reset HAL!\n");
|
"Failed to stop TX DMA. Resetting hardware!\n");
|
||||||
|
|
||||||
spin_lock_bh(&sc->sc_resetlock);
|
spin_lock_bh(&sc->sc_resetlock);
|
||||||
r = ath9k_hw_reset(ah, sc->sc_ah->curchan, false);
|
r = ath9k_hw_reset(ah, sc->sc_ah->curchan, false);
|
||||||
@ -1728,6 +1728,8 @@ static int ath_tx_setup_buffer(struct ieee80211_hw *hw, struct ath_buf *bf,
|
|||||||
} else
|
} else
|
||||||
bf->bf_isnullfunc = false;
|
bf->bf_isnullfunc = false;
|
||||||
|
|
||||||
|
bf->bf_tx_aborted = false;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1989,7 +1991,7 @@ static int ath_tx_num_badfrms(struct ath_softc *sc, struct ath_buf *bf,
|
|||||||
int nbad = 0;
|
int nbad = 0;
|
||||||
int isaggr = 0;
|
int isaggr = 0;
|
||||||
|
|
||||||
if (bf->bf_tx_aborted)
|
if (bf->bf_lastbf->bf_tx_aborted)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
isaggr = bf_isaggr(bf);
|
isaggr = bf_isaggr(bf);
|
||||||
|
@ -329,9 +329,8 @@ static int process_rxed_802_11_packet(struct lbs_private *priv,
|
|||||||
/* create the exported radio header */
|
/* create the exported radio header */
|
||||||
|
|
||||||
/* radiotap header */
|
/* radiotap header */
|
||||||
radiotap_hdr.hdr.it_version = 0;
|
memset(&radiotap_hdr, 0, sizeof(radiotap_hdr));
|
||||||
/* XXX must check this value for pad */
|
/* XXX must check radiotap_hdr.hdr.it_pad for pad */
|
||||||
radiotap_hdr.hdr.it_pad = 0;
|
|
||||||
radiotap_hdr.hdr.it_len = cpu_to_le16 (sizeof(struct rx_radiotap_hdr));
|
radiotap_hdr.hdr.it_len = cpu_to_le16 (sizeof(struct rx_radiotap_hdr));
|
||||||
radiotap_hdr.hdr.it_present = cpu_to_le32 (RX_RADIOTAP_PRESENT);
|
radiotap_hdr.hdr.it_present = cpu_to_le32 (RX_RADIOTAP_PRESENT);
|
||||||
radiotap_hdr.rate = convert_mv_rate_to_radiotap(prxpd->rx_rate);
|
radiotap_hdr.rate = convert_mv_rate_to_radiotap(prxpd->rx_rate);
|
||||||
|
@ -413,7 +413,7 @@ static void rt2800usb_write_tx_desc(struct rt2x00_dev *rt2x00dev,
|
|||||||
*/
|
*/
|
||||||
rt2x00_desc_read(txi, 0, &word);
|
rt2x00_desc_read(txi, 0, &word);
|
||||||
rt2x00_set_field32(&word, TXINFO_W0_USB_DMA_TX_PKT_LEN,
|
rt2x00_set_field32(&word, TXINFO_W0_USB_DMA_TX_PKT_LEN,
|
||||||
skb->len - TXINFO_DESC_SIZE);
|
skb->len + TXWI_DESC_SIZE);
|
||||||
rt2x00_set_field32(&word, TXINFO_W0_WIV,
|
rt2x00_set_field32(&word, TXINFO_W0_WIV,
|
||||||
!test_bit(ENTRY_TXD_ENCRYPT_IV, &txdesc->flags));
|
!test_bit(ENTRY_TXD_ENCRYPT_IV, &txdesc->flags));
|
||||||
rt2x00_set_field32(&word, TXINFO_W0_QSEL, 2);
|
rt2x00_set_field32(&word, TXINFO_W0_QSEL, 2);
|
||||||
|
@ -625,9 +625,12 @@ static int ssb_pci_sprom_get(struct ssb_bus *bus,
|
|||||||
ssb_printk(KERN_ERR PFX "No SPROM available!\n");
|
ssb_printk(KERN_ERR PFX "No SPROM available!\n");
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
|
if (bus->chipco.dev) { /* can be unavailible! */
|
||||||
bus->sprom_offset = (bus->chipco.dev->id.revision < 31) ?
|
bus->sprom_offset = (bus->chipco.dev->id.revision < 31) ?
|
||||||
SSB_SPROM_BASE1 : SSB_SPROM_BASE31;
|
SSB_SPROM_BASE1 : SSB_SPROM_BASE31;
|
||||||
|
} else {
|
||||||
|
bus->sprom_offset = SSB_SPROM_BASE1;
|
||||||
|
}
|
||||||
|
|
||||||
buf = kcalloc(SSB_SPROMSIZE_WORDS_R123, sizeof(u16), GFP_KERNEL);
|
buf = kcalloc(SSB_SPROMSIZE_WORDS_R123, sizeof(u16), GFP_KERNEL);
|
||||||
if (!buf)
|
if (!buf)
|
||||||
|
@ -185,6 +185,7 @@ bool ssb_is_sprom_available(struct ssb_bus *bus)
|
|||||||
/* this routine differs from specs as we do not access SPROM directly
|
/* this routine differs from specs as we do not access SPROM directly
|
||||||
on PCMCIA */
|
on PCMCIA */
|
||||||
if (bus->bustype == SSB_BUSTYPE_PCI &&
|
if (bus->bustype == SSB_BUSTYPE_PCI &&
|
||||||
|
bus->chipco.dev && /* can be unavailible! */
|
||||||
bus->chipco.dev->id.revision >= 31)
|
bus->chipco.dev->id.revision >= 31)
|
||||||
return bus->chipco.capabilities & SSB_CHIPCO_CAP_SPROM;
|
return bus->chipco.capabilities & SSB_CHIPCO_CAP_SPROM;
|
||||||
|
|
||||||
|
@ -501,7 +501,7 @@ static inline struct sk_buff *alloc_skb_fclone(unsigned int size,
|
|||||||
return __alloc_skb(size, priority, 1, -1);
|
return __alloc_skb(size, priority, 1, -1);
|
||||||
}
|
}
|
||||||
|
|
||||||
extern int skb_recycle_check(struct sk_buff *skb, int skb_size);
|
extern bool skb_recycle_check(struct sk_buff *skb, int skb_size);
|
||||||
|
|
||||||
extern struct sk_buff *skb_morph(struct sk_buff *dst, struct sk_buff *src);
|
extern struct sk_buff *skb_morph(struct sk_buff *dst, struct sk_buff *src);
|
||||||
extern struct sk_buff *skb_clone(struct sk_buff *skb,
|
extern struct sk_buff *skb_clone(struct sk_buff *skb,
|
||||||
|
@ -59,16 +59,18 @@ static int cfserl_receive(struct cflayer *l, struct cfpkt *newpkt)
|
|||||||
u8 stx = CFSERL_STX;
|
u8 stx = CFSERL_STX;
|
||||||
int ret;
|
int ret;
|
||||||
u16 expectlen = 0;
|
u16 expectlen = 0;
|
||||||
|
|
||||||
caif_assert(newpkt != NULL);
|
caif_assert(newpkt != NULL);
|
||||||
spin_lock(&layr->sync);
|
spin_lock(&layr->sync);
|
||||||
|
|
||||||
if (layr->incomplete_frm != NULL) {
|
if (layr->incomplete_frm != NULL) {
|
||||||
|
|
||||||
layr->incomplete_frm =
|
layr->incomplete_frm =
|
||||||
cfpkt_append(layr->incomplete_frm, newpkt, expectlen);
|
cfpkt_append(layr->incomplete_frm, newpkt, expectlen);
|
||||||
pkt = layr->incomplete_frm;
|
pkt = layr->incomplete_frm;
|
||||||
if (pkt == NULL)
|
if (pkt == NULL) {
|
||||||
|
spin_unlock(&layr->sync);
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
pkt = newpkt;
|
pkt = newpkt;
|
||||||
}
|
}
|
||||||
|
@ -482,22 +482,22 @@ EXPORT_SYMBOL(consume_skb);
|
|||||||
* reference count dropping and cleans up the skbuff as if it
|
* reference count dropping and cleans up the skbuff as if it
|
||||||
* just came from __alloc_skb().
|
* just came from __alloc_skb().
|
||||||
*/
|
*/
|
||||||
int skb_recycle_check(struct sk_buff *skb, int skb_size)
|
bool skb_recycle_check(struct sk_buff *skb, int skb_size)
|
||||||
{
|
{
|
||||||
struct skb_shared_info *shinfo;
|
struct skb_shared_info *shinfo;
|
||||||
|
|
||||||
if (irqs_disabled())
|
if (irqs_disabled())
|
||||||
return 0;
|
return false;
|
||||||
|
|
||||||
if (skb_is_nonlinear(skb) || skb->fclone != SKB_FCLONE_UNAVAILABLE)
|
if (skb_is_nonlinear(skb) || skb->fclone != SKB_FCLONE_UNAVAILABLE)
|
||||||
return 0;
|
return false;
|
||||||
|
|
||||||
skb_size = SKB_DATA_ALIGN(skb_size + NET_SKB_PAD);
|
skb_size = SKB_DATA_ALIGN(skb_size + NET_SKB_PAD);
|
||||||
if (skb_end_pointer(skb) - skb->head < skb_size)
|
if (skb_end_pointer(skb) - skb->head < skb_size)
|
||||||
return 0;
|
return false;
|
||||||
|
|
||||||
if (skb_shared(skb) || skb_cloned(skb))
|
if (skb_shared(skb) || skb_cloned(skb))
|
||||||
return 0;
|
return false;
|
||||||
|
|
||||||
skb_release_head_state(skb);
|
skb_release_head_state(skb);
|
||||||
|
|
||||||
@ -509,7 +509,7 @@ int skb_recycle_check(struct sk_buff *skb, int skb_size)
|
|||||||
skb->data = skb->head + NET_SKB_PAD;
|
skb->data = skb->head + NET_SKB_PAD;
|
||||||
skb_reset_tail_pointer(skb);
|
skb_reset_tail_pointer(skb);
|
||||||
|
|
||||||
return 1;
|
return true;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(skb_recycle_check);
|
EXPORT_SYMBOL(skb_recycle_check);
|
||||||
|
|
||||||
@ -2996,7 +2996,11 @@ void skb_tstamp_tx(struct sk_buff *orig_skb,
|
|||||||
memset(serr, 0, sizeof(*serr));
|
memset(serr, 0, sizeof(*serr));
|
||||||
serr->ee.ee_errno = ENOMSG;
|
serr->ee.ee_errno = ENOMSG;
|
||||||
serr->ee.ee_origin = SO_EE_ORIGIN_TIMESTAMPING;
|
serr->ee.ee_origin = SO_EE_ORIGIN_TIMESTAMPING;
|
||||||
|
|
||||||
|
bh_lock_sock(sk);
|
||||||
err = sock_queue_err_skb(sk, skb);
|
err = sock_queue_err_skb(sk, skb);
|
||||||
|
bh_unlock_sock(sk);
|
||||||
|
|
||||||
if (err)
|
if (err)
|
||||||
kfree_skb(skb);
|
kfree_skb(skb);
|
||||||
}
|
}
|
||||||
|
@ -634,7 +634,9 @@ void __udp4_lib_err(struct sk_buff *skb, u32 info, struct udp_table *udptable)
|
|||||||
if (!harderr || sk->sk_state != TCP_ESTABLISHED)
|
if (!harderr || sk->sk_state != TCP_ESTABLISHED)
|
||||||
goto out;
|
goto out;
|
||||||
} else {
|
} else {
|
||||||
|
bh_lock_sock(sk);
|
||||||
ip_icmp_error(sk, skb, err, uh->dest, info, (u8 *)(uh+1));
|
ip_icmp_error(sk, skb, err, uh->dest, info, (u8 *)(uh+1));
|
||||||
|
bh_unlock_sock(sk);
|
||||||
}
|
}
|
||||||
sk->sk_err = err;
|
sk->sk_err = err;
|
||||||
sk->sk_error_report(sk);
|
sk->sk_error_report(sk);
|
||||||
|
@ -814,7 +814,7 @@ struct dst_entry * ip6_route_output(struct net *net, struct sock *sk,
|
|||||||
{
|
{
|
||||||
int flags = 0;
|
int flags = 0;
|
||||||
|
|
||||||
if (fl->oif || rt6_need_strict(&fl->fl6_dst))
|
if ((sk && sk->sk_bound_dev_if) || rt6_need_strict(&fl->fl6_dst))
|
||||||
flags |= RT6_LOOKUP_F_IFACE;
|
flags |= RT6_LOOKUP_F_IFACE;
|
||||||
|
|
||||||
if (!ipv6_addr_any(&fl->fl6_src))
|
if (!ipv6_addr_any(&fl->fl6_src))
|
||||||
|
@ -466,9 +466,11 @@ void __udp6_lib_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
|
|||||||
if (sk->sk_state != TCP_ESTABLISHED && !np->recverr)
|
if (sk->sk_state != TCP_ESTABLISHED && !np->recverr)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
if (np->recverr)
|
if (np->recverr) {
|
||||||
|
bh_lock_sock(sk);
|
||||||
ipv6_icmp_error(sk, skb, err, uh->dest, ntohl(info), (u8 *)(uh+1));
|
ipv6_icmp_error(sk, skb, err, uh->dest, ntohl(info), (u8 *)(uh+1));
|
||||||
|
bh_unlock_sock(sk);
|
||||||
|
}
|
||||||
sk->sk_err = err;
|
sk->sk_err = err;
|
||||||
sk->sk_error_report(sk);
|
sk->sk_error_report(sk);
|
||||||
out:
|
out:
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
#include <linux/nl80211.h>
|
#include <linux/nl80211.h>
|
||||||
#include "ieee80211_i.h"
|
#include "ieee80211_i.h"
|
||||||
|
|
||||||
enum ieee80211_chan_mode
|
static enum ieee80211_chan_mode
|
||||||
__ieee80211_get_channel_mode(struct ieee80211_local *local,
|
__ieee80211_get_channel_mode(struct ieee80211_local *local,
|
||||||
struct ieee80211_sub_if_data *ignore)
|
struct ieee80211_sub_if_data *ignore)
|
||||||
{
|
{
|
||||||
|
@ -1045,12 +1045,12 @@ static void pep_sock_unhash(struct sock *sk)
|
|||||||
lock_sock(sk);
|
lock_sock(sk);
|
||||||
if ((1 << sk->sk_state) & ~(TCPF_CLOSE|TCPF_LISTEN)) {
|
if ((1 << sk->sk_state) & ~(TCPF_CLOSE|TCPF_LISTEN)) {
|
||||||
skparent = pn->listener;
|
skparent = pn->listener;
|
||||||
sk_del_node_init(sk);
|
|
||||||
release_sock(sk);
|
release_sock(sk);
|
||||||
|
|
||||||
sk = skparent;
|
|
||||||
pn = pep_sk(skparent);
|
pn = pep_sk(skparent);
|
||||||
lock_sock(sk);
|
lock_sock(skparent);
|
||||||
|
sk_del_node_init(sk);
|
||||||
|
sk = skparent;
|
||||||
}
|
}
|
||||||
/* Unhash a listening sock only when it is closed
|
/* Unhash a listening sock only when it is closed
|
||||||
* and all of its active connected pipes are closed. */
|
* and all of its active connected pipes are closed. */
|
||||||
|
@ -475,6 +475,7 @@ int rds_ib_cm_handle_connect(struct rdma_cm_id *cm_id,
|
|||||||
err = rds_ib_setup_qp(conn);
|
err = rds_ib_setup_qp(conn);
|
||||||
if (err) {
|
if (err) {
|
||||||
rds_ib_conn_error(conn, "rds_ib_setup_qp failed (%d)\n", err);
|
rds_ib_conn_error(conn, "rds_ib_setup_qp failed (%d)\n", err);
|
||||||
|
mutex_unlock(&conn->c_cm_lock);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -452,6 +452,7 @@ int rds_iw_cm_handle_connect(struct rdma_cm_id *cm_id,
|
|||||||
err = rds_iw_setup_qp(conn);
|
err = rds_iw_setup_qp(conn);
|
||||||
if (err) {
|
if (err) {
|
||||||
rds_iw_conn_error(conn, "rds_iw_setup_qp failed (%d)\n", err);
|
rds_iw_conn_error(conn, "rds_iw_setup_qp failed (%d)\n", err);
|
||||||
|
mutex_unlock(&conn->c_cm_lock);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user