Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit adea27f4 authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6

* 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6:
  [NETFILTER]: Fix NULL pointer dereference in nf_nat_move_storage()
  [SUNHME]: VLAN support for sunhme
  [CHELSIO]: Fix skb->dev setting.
  [NETFILTER]: fix compat_nf_sockopt typo
  [INET]: Fix potential kfree on vmalloc-ed area of request_sock_queue
  [VIA_VELOCITY]: Don't oops on MTU change.
  iwl4965: fix not correctly dealing with hotunplug
  rt2x00: Fix chipset revision validation
  iwl3945: place CCK rates in front of OFDM for supported rates
  mac80211: Fix queuing of scan containing a SSID
parents 40787d00 77996525
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -1379,11 +1379,11 @@ static void sge_rx(struct sge *sge, struct freelQ *fl, unsigned int len)
	}
	__skb_pull(skb, sizeof(*p));

	skb->dev->last_rx = jiffies;
	st = per_cpu_ptr(sge->port_stats[p->iff], smp_processor_id());
	st->rx_packets++;

	skb->protocol = eth_type_trans(skb, adapter->port[p->iff].dev);
	skb->dev->last_rx = jiffies;
	if ((adapter->flags & RX_CSUM_ENABLED) && p->csum == 0xffff &&
	    skb->protocol == htons(ETH_P_IP) &&
	    (skb->data[9] == IPPROTO_TCP || skb->data[9] == IPPROTO_UDP)) {
+11 −6
Original line number Diff line number Diff line
@@ -1281,7 +1281,7 @@ static void happy_meal_init_rings(struct happy_meal *hp)
		skb->dev = dev;

		/* Because we reserve afterwards. */
		skb_put(skb, (ETH_FRAME_LEN + RX_OFFSET));
		skb_put(skb, (ETH_FRAME_LEN + RX_OFFSET + 4));
		hme_write_rxd(hp, &hb->happy_meal_rxd[i],
			      (RXFLAG_OWN | ((RX_BUF_ALLOC_SIZE - RX_OFFSET) << 16)),
			      hme_dma_map(hp, skb->data, RX_BUF_ALLOC_SIZE, DMA_FROMDEVICE));
@@ -1700,6 +1700,11 @@ static int happy_meal_init(struct happy_meal *hp)
	HMD(("tx old[%08x] and rx [%08x] ON!\n",
	     hme_read32(hp, bregs + BMAC_TXCFG),
	     hme_read32(hp, bregs + BMAC_RXCFG)));

	/* Set larger TX/RX size to allow for 802.1q */
	hme_write32(hp, bregs + BMAC_TXMAX, ETH_FRAME_LEN + 8);
	hme_write32(hp, bregs + BMAC_RXMAX, ETH_FRAME_LEN + 8);

	hme_write32(hp, bregs + BMAC_TXCFG,
		    hme_read32(hp, bregs + BMAC_TXCFG) | BIGMAC_TXCFG_ENABLE);
	hme_write32(hp, bregs + BMAC_RXCFG,
@@ -2039,7 +2044,7 @@ static void happy_meal_rx(struct happy_meal *hp, struct net_device *dev)
			hme_dma_unmap(hp, dma_addr, RX_BUF_ALLOC_SIZE, DMA_FROMDEVICE);
			hp->rx_skbs[elem] = new_skb;
			new_skb->dev = dev;
			skb_put(new_skb, (ETH_FRAME_LEN + RX_OFFSET));
			skb_put(new_skb, (ETH_FRAME_LEN + RX_OFFSET + 4));
			hme_write_rxd(hp, this,
				      (RXFLAG_OWN|((RX_BUF_ALLOC_SIZE-RX_OFFSET)<<16)),
				      hme_dma_map(hp, new_skb->data, RX_BUF_ALLOC_SIZE, DMA_FROMDEVICE));
@@ -2809,8 +2814,8 @@ static int __devinit happy_meal_sbus_probe_one(struct sbus_dev *sdev, int is_qfe
	dev->watchdog_timeo = 5*HZ;
	dev->ethtool_ops = &hme_ethtool_ops;

	/* Happy Meal can do it all... except VLAN. */
	dev->features |= NETIF_F_SG | NETIF_F_HW_CSUM | NETIF_F_VLAN_CHALLENGED;
	/* Happy Meal can do it all... */
	dev->features |= NETIF_F_SG | NETIF_F_HW_CSUM;

	dev->irq = sdev->irqs[0];

@@ -3143,8 +3148,8 @@ static int __devinit happy_meal_pci_probe(struct pci_dev *pdev,
	dev->irq = pdev->irq;
	dev->dma = 0;

	/* Happy Meal can do it all... except VLAN. */
	dev->features |= NETIF_F_SG | NETIF_F_HW_CSUM | NETIF_F_VLAN_CHALLENGED;
	/* Happy Meal can do it all... */
	dev->features |= NETIF_F_SG | NETIF_F_HW_CSUM;

#if defined(CONFIG_SBUS) && defined(CONFIG_PCI)
	/* Hook up PCI register/dma accessors. */
+5 −0
Original line number Diff line number Diff line
@@ -1963,6 +1963,11 @@ static int velocity_change_mtu(struct net_device *dev, int new_mtu)
		return -EINVAL;
	}

	if (!netif_running(dev)) {
		dev->mtu = new_mtu;
		return 0;
	}

	if (new_mtu != oldmtu) {
		spin_lock_irqsave(&vptr->lock, flags);

+48 −8
Original line number Diff line number Diff line
@@ -71,19 +71,19 @@ struct iwl_rate_scale_priv {
};

static s32 iwl_expected_tpt_g[IWL_RATE_COUNT] = {
	0, 0, 76, 104, 130, 168, 191, 202, 7, 13, 35, 58
	7, 13, 35, 58, 0, 0, 76, 104, 130, 168, 191, 202
};

static s32 iwl_expected_tpt_g_prot[IWL_RATE_COUNT] = {
	0, 0, 0, 80, 93, 113, 123, 125, 7, 13, 35, 58
	7, 13, 35, 58, 0, 0, 0, 80, 93, 113, 123, 125
};

static s32 iwl_expected_tpt_a[IWL_RATE_COUNT] = {
	40, 57, 72, 98, 121, 154, 177, 186, 0, 0, 0, 0
	0, 0, 0, 0, 40, 57, 72, 98, 121, 154, 177, 186
};

static s32 iwl_expected_tpt_b[IWL_RATE_COUNT] = {
	0, 0, 0, 0, 0, 0, 0, 0, 7, 13, 35, 58
	7, 13, 35, 58, 0, 0, 0, 0, 0, 0, 0, 0
};

struct iwl_tpt_entry {
@@ -350,6 +350,10 @@ static void rs_rate_init(void *priv_rate, void *priv_sta,

	sta->last_txrate = sta->txrate;

	/* For MODE_IEEE80211A mode it start at IWL_FIRST_OFDM_RATE */
        if (local->hw.conf.phymode == MODE_IEEE80211A)
                sta->last_txrate += IWL_FIRST_OFDM_RATE;

	IWL_DEBUG_RATE("leave\n");
}

@@ -417,6 +421,33 @@ static void rs_free_sta(void *priv, void *priv_sta)
	IWL_DEBUG_RATE("leave\n");
}


/*
 * get ieee prev rate from rate scale table.
 * for A and B mode we need to overright prev
 * value
 */
static int rs_adjust_next_rate(struct iwl_priv *priv, int rate)
{
	int next_rate = iwl_get_prev_ieee_rate(rate);

	switch (priv->phymode) {
	case MODE_IEEE80211A:
		if (rate == IWL_RATE_12M_INDEX)
			next_rate = IWL_RATE_9M_INDEX;
		else if (rate == IWL_RATE_6M_INDEX)
			next_rate = IWL_RATE_6M_INDEX;
		break;
	case MODE_IEEE80211B:
		if (rate == IWL_RATE_11M_INDEX_TABLE)
			next_rate = IWL_RATE_5M_INDEX_TABLE;
		break;
	default:
		break;
	}

	return next_rate;
}
/**
 * rs_tx_status - Update rate control values based on Tx results
 *
@@ -479,7 +510,8 @@ static void rs_tx_status(void *priv_rate,
			last_index = scale_rate_index;
		} else {
			current_count = priv->retry_rate;
			last_index = iwl_get_prev_ieee_rate(scale_rate_index);
			last_index = rs_adjust_next_rate(priv,
							 scale_rate_index);
		}

		/* Update this rate accounting for as many retries
@@ -494,9 +526,10 @@ static void rs_tx_status(void *priv_rate,

		if (retries)
			scale_rate_index =
			    iwl_get_prev_ieee_rate(scale_rate_index);
			    rs_adjust_next_rate(priv, scale_rate_index);
	}


	/* Update the last index window with success/failure based on ACK */
	IWL_DEBUG_RATE("Update rate %d with %s.\n",
		       last_index,
@@ -672,7 +705,10 @@ static struct ieee80211_rate *rs_get_rate(void *priv_rate,
	}

	rate_mask = sta->supp_rates;
	index = min(sta->txrate & 0xffff, IWL_RATE_COUNT - 1);
	index = min(sta->last_txrate & 0xffff, IWL_RATE_COUNT - 1);

	if (priv->phymode == (u8) MODE_IEEE80211A)
		rate_mask = rate_mask << IWL_FIRST_OFDM_RATE;

	rs_priv = (void *)sta->rate_ctrl_priv;

@@ -801,7 +837,11 @@ static struct ieee80211_rate *rs_get_rate(void *priv_rate,
 out:

	sta->last_txrate = index;
	if (priv->phymode == (u8) MODE_IEEE80211A)
		sta->txrate = sta->last_txrate - IWL_FIRST_OFDM_RATE;
	else
		sta->txrate = sta->last_txrate;

	sta_info_put(sta);

	IWL_DEBUG_RATE("leave: %d\n", index);
+24 −5
Original line number Diff line number Diff line
@@ -36,10 +36,17 @@ struct iwl_rate_info {
	u8 next_rs;		/* next rate used in rs algo */
	u8 prev_rs_tgg;		/* previous rate used in TGG rs algo */
	u8 next_rs_tgg;		/* next rate used in TGG rs algo */
        u8 table_rs_index;	/* index in rate scale table cmd */
        u8 prev_table_rs;	/* prev in rate table cmd */

};

enum {
	IWL_RATE_6M_INDEX = 0,
	IWL_RATE_1M_INDEX = 0,
	IWL_RATE_2M_INDEX,
	IWL_RATE_5M_INDEX,
	IWL_RATE_11M_INDEX,
	IWL_RATE_6M_INDEX,
	IWL_RATE_9M_INDEX,
	IWL_RATE_12M_INDEX,
	IWL_RATE_18M_INDEX,
@@ -47,15 +54,27 @@ enum {
	IWL_RATE_36M_INDEX,
	IWL_RATE_48M_INDEX,
	IWL_RATE_54M_INDEX,
	IWL_RATE_1M_INDEX,
	IWL_RATE_2M_INDEX,
	IWL_RATE_5M_INDEX,
	IWL_RATE_11M_INDEX,
	IWL_RATE_COUNT,
	IWL_RATE_INVM_INDEX,
	IWL_RATE_INVALID = IWL_RATE_INVM_INDEX
};

enum {
	IWL_RATE_6M_INDEX_TABLE = 0,
	IWL_RATE_9M_INDEX_TABLE,
	IWL_RATE_12M_INDEX_TABLE,
	IWL_RATE_18M_INDEX_TABLE,
	IWL_RATE_24M_INDEX_TABLE,
	IWL_RATE_36M_INDEX_TABLE,
	IWL_RATE_48M_INDEX_TABLE,
	IWL_RATE_54M_INDEX_TABLE,
	IWL_RATE_1M_INDEX_TABLE,
	IWL_RATE_2M_INDEX_TABLE,
	IWL_RATE_5M_INDEX_TABLE,
	IWL_RATE_11M_INDEX_TABLE,
	IWL_RATE_INVM_INDEX_TABLE = IWL_RATE_INVM_INDEX,
};

enum {
	IWL_FIRST_OFDM_RATE = IWL_RATE_6M_INDEX,
	IWL_LAST_OFDM_RATE = IWL_RATE_54M_INDEX,
Loading