aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/staging
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2015-05-17 00:04:56 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2015-05-17 00:04:56 -0400
commit3f4741b1d863f624e8632b3283af5eabe35c2fca (patch)
tree450df928579a5db36ca450ab44ae12d51d9fbe31 /drivers/staging
parent148c46f3e12bfd877c4fcec986f55988f21b0857 (diff)
parentec94efcdadab69f41d257a1054260f8295ab77ef (diff)
Merge tag 'staging-4.1-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging
Pull staging / IIO driver fixes from Greg KH: "Here's some staging and iio driver fixes to resolve a number of reported issues. All of these have been in linux-next for a while" * tag 'staging-4.1-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging: (31 commits) iio: light: hid-sensor-prox: Fix memory leak in probe() iio: adc: cc10001: Add delay before setting START bit iio: adc: cc10001: Fix regulator_get_voltage() return value check iio: adc: cc10001: Fix incorrect use of power-up/power-down register staging: gdm724x: Correction of variable usage after applying ALIGN() iio: adc: cc10001: Fix the channel number mapping staging: vt6655: lock MACvWriteBSSIDAddress. staging: vt6655: CARDbUpdateTSF bss timestamp correct tsf counter value. staging: vt6655: vnt_tx_packet Correct TX order of OWNED_BY_NIC staging: vt6655: Fix 80211 control and management status reporting. staging: vt6655: implement IEEE80211_TX_STAT_NOACK_TRANSMITTED staging: vt6655: device_free_tx_buf use only ieee80211_tx_status_irqsafe staging: vt6656: use ieee80211_tx_info to select packet type. staging: rtl8712: freeing an ERR_PTR staging: sm750: remove incorrect __exit annotation iio: kfifo: Set update_needed to false only if a buffer was allocated iio: mcp320x: Fix occasional incorrect readings iio: accel: mma9553: check input value for activity period iio: accel: mma9553: add enable channel for activity iio: accel: mma9551_core: prevent buffer overrun ...
Diffstat (limited to 'drivers/staging')
-rw-r--r--drivers/staging/gdm724x/gdm_mux.c16
-rw-r--r--drivers/staging/rtl8712/rtl871x_ioctl_linux.c17
-rw-r--r--drivers/staging/sm750fb/sm750.c2
-rw-r--r--drivers/staging/vt6655/card.c10
-rw-r--r--drivers/staging/vt6655/card.h2
-rw-r--r--drivers/staging/vt6655/device_main.c42
-rw-r--r--drivers/staging/vt6656/rxtx.c14
7 files changed, 59 insertions, 44 deletions
diff --git a/drivers/staging/gdm724x/gdm_mux.c b/drivers/staging/gdm724x/gdm_mux.c
index 8199b0a697bb..1cf24e4edf25 100644
--- a/drivers/staging/gdm724x/gdm_mux.c
+++ b/drivers/staging/gdm724x/gdm_mux.c
@@ -158,7 +158,7 @@ static int up_to_host(struct mux_rx *r)
158 unsigned int start_flag; 158 unsigned int start_flag;
159 unsigned int payload_size; 159 unsigned int payload_size;
160 unsigned short packet_type; 160 unsigned short packet_type;
161 int dummy_cnt; 161 int total_len;
162 u32 packet_size_sum = r->offset; 162 u32 packet_size_sum = r->offset;
163 int index; 163 int index;
164 int ret = TO_HOST_INVALID_PACKET; 164 int ret = TO_HOST_INVALID_PACKET;
@@ -176,10 +176,10 @@ static int up_to_host(struct mux_rx *r)
176 break; 176 break;
177 } 177 }
178 178
179 dummy_cnt = ALIGN(MUX_HEADER_SIZE + payload_size, 4); 179 total_len = ALIGN(MUX_HEADER_SIZE + payload_size, 4);
180 180
181 if (len - packet_size_sum < 181 if (len - packet_size_sum <
182 MUX_HEADER_SIZE + payload_size + dummy_cnt) { 182 total_len) {
183 pr_err("invalid payload : %d %d %04x\n", 183 pr_err("invalid payload : %d %d %04x\n",
184 payload_size, len, packet_type); 184 payload_size, len, packet_type);
185 break; 185 break;
@@ -202,7 +202,7 @@ static int up_to_host(struct mux_rx *r)
202 break; 202 break;
203 } 203 }
204 204
205 packet_size_sum += MUX_HEADER_SIZE + payload_size + dummy_cnt; 205 packet_size_sum += total_len;
206 if (len - packet_size_sum <= MUX_HEADER_SIZE + 2) { 206 if (len - packet_size_sum <= MUX_HEADER_SIZE + 2) {
207 ret = r->callback(NULL, 207 ret = r->callback(NULL,
208 0, 208 0,
@@ -361,7 +361,6 @@ static int gdm_mux_send(void *priv_dev, void *data, int len, int tty_index,
361 struct mux_pkt_header *mux_header; 361 struct mux_pkt_header *mux_header;
362 struct mux_tx *t = NULL; 362 struct mux_tx *t = NULL;
363 static u32 seq_num = 1; 363 static u32 seq_num = 1;
364 int dummy_cnt;
365 int total_len; 364 int total_len;
366 int ret; 365 int ret;
367 unsigned long flags; 366 unsigned long flags;
@@ -374,9 +373,7 @@ static int gdm_mux_send(void *priv_dev, void *data, int len, int tty_index,
374 373
375 spin_lock_irqsave(&mux_dev->write_lock, flags); 374 spin_lock_irqsave(&mux_dev->write_lock, flags);
376 375
377 dummy_cnt = ALIGN(MUX_HEADER_SIZE + len, 4); 376 total_len = ALIGN(MUX_HEADER_SIZE + len, 4);
378
379 total_len = len + MUX_HEADER_SIZE + dummy_cnt;
380 377
381 t = alloc_mux_tx(total_len); 378 t = alloc_mux_tx(total_len);
382 if (!t) { 379 if (!t) {
@@ -392,7 +389,8 @@ static int gdm_mux_send(void *priv_dev, void *data, int len, int tty_index,
392 mux_header->packet_type = __cpu_to_le16(packet_type[tty_index]); 389 mux_header->packet_type = __cpu_to_le16(packet_type[tty_index]);
393 390
394 memcpy(t->buf+MUX_HEADER_SIZE, data, len); 391 memcpy(t->buf+MUX_HEADER_SIZE, data, len);
395 memset(t->buf+MUX_HEADER_SIZE+len, 0, dummy_cnt); 392 memset(t->buf+MUX_HEADER_SIZE+len, 0, total_len - MUX_HEADER_SIZE -
393 len);
396 394
397 t->len = total_len; 395 t->len = total_len;
398 t->callback = cb; 396 t->callback = cb;
diff --git a/drivers/staging/rtl8712/rtl871x_ioctl_linux.c b/drivers/staging/rtl8712/rtl871x_ioctl_linux.c
index 42fba3f5b593..cb0b6387789f 100644
--- a/drivers/staging/rtl8712/rtl871x_ioctl_linux.c
+++ b/drivers/staging/rtl8712/rtl871x_ioctl_linux.c
@@ -1900,23 +1900,20 @@ static int r871x_mp_ioctl_hdl(struct net_device *dev,
1900 struct mp_ioctl_handler *phandler; 1900 struct mp_ioctl_handler *phandler;
1901 struct mp_ioctl_param *poidparam; 1901 struct mp_ioctl_param *poidparam;
1902 unsigned long BytesRead, BytesWritten, BytesNeeded; 1902 unsigned long BytesRead, BytesWritten, BytesNeeded;
1903 u8 *pparmbuf = NULL, bset; 1903 u8 *pparmbuf, bset;
1904 u16 len; 1904 u16 len;
1905 uint status; 1905 uint status;
1906 int ret = 0; 1906 int ret = 0;
1907 1907
1908 if ((!p->length) || (!p->pointer)) { 1908 if ((!p->length) || (!p->pointer))
1909 ret = -EINVAL; 1909 return -EINVAL;
1910 goto _r871x_mp_ioctl_hdl_exit; 1910
1911 }
1912 bset = (u8)(p->flags & 0xFFFF); 1911 bset = (u8)(p->flags & 0xFFFF);
1913 len = p->length; 1912 len = p->length;
1914 pparmbuf = NULL;
1915 pparmbuf = memdup_user(p->pointer, len); 1913 pparmbuf = memdup_user(p->pointer, len);
1916 if (IS_ERR(pparmbuf)) { 1914 if (IS_ERR(pparmbuf))
1917 ret = PTR_ERR(pparmbuf); 1915 return PTR_ERR(pparmbuf);
1918 goto _r871x_mp_ioctl_hdl_exit; 1916
1919 }
1920 poidparam = (struct mp_ioctl_param *)pparmbuf; 1917 poidparam = (struct mp_ioctl_param *)pparmbuf;
1921 if (poidparam->subcode >= MAX_MP_IOCTL_SUBCODE) { 1918 if (poidparam->subcode >= MAX_MP_IOCTL_SUBCODE) {
1922 ret = -EINVAL; 1919 ret = -EINVAL;
diff --git a/drivers/staging/sm750fb/sm750.c b/drivers/staging/sm750fb/sm750.c
index 3c7ea95dd9f9..dbbb2f879a29 100644
--- a/drivers/staging/sm750fb/sm750.c
+++ b/drivers/staging/sm750fb/sm750.c
@@ -1250,7 +1250,7 @@ err_enable:
1250 return -ENODEV; 1250 return -ENODEV;
1251} 1251}
1252 1252
1253static void __exit lynxfb_pci_remove(struct pci_dev *pdev) 1253static void lynxfb_pci_remove(struct pci_dev *pdev)
1254{ 1254{
1255 struct fb_info *info; 1255 struct fb_info *info;
1256 struct lynx_share *share; 1256 struct lynx_share *share;
diff --git a/drivers/staging/vt6655/card.c b/drivers/staging/vt6655/card.c
index 1cdcf49b2445..e00c0605d154 100644
--- a/drivers/staging/vt6655/card.c
+++ b/drivers/staging/vt6655/card.c
@@ -362,12 +362,16 @@ bool CARDbSetPhyParameter(struct vnt_private *pDevice, u8 bb_type)
362 * Return Value: none 362 * Return Value: none
363 */ 363 */
364bool CARDbUpdateTSF(struct vnt_private *pDevice, unsigned char byRxRate, 364bool CARDbUpdateTSF(struct vnt_private *pDevice, unsigned char byRxRate,
365 u64 qwBSSTimestamp, u64 qwLocalTSF) 365 u64 qwBSSTimestamp)
366{ 366{
367 u64 local_tsf;
367 u64 qwTSFOffset = 0; 368 u64 qwTSFOffset = 0;
368 369
369 if (qwBSSTimestamp != qwLocalTSF) { 370 CARDbGetCurrentTSF(pDevice, &local_tsf);
370 qwTSFOffset = CARDqGetTSFOffset(byRxRate, qwBSSTimestamp, qwLocalTSF); 371
372 if (qwBSSTimestamp != local_tsf) {
373 qwTSFOffset = CARDqGetTSFOffset(byRxRate, qwBSSTimestamp,
374 local_tsf);
371 /* adjust TSF, HW's TSF add TSF Offset reg */ 375 /* adjust TSF, HW's TSF add TSF Offset reg */
372 VNSvOutPortD(pDevice->PortOffset + MAC_REG_TSFOFST, (u32)qwTSFOffset); 376 VNSvOutPortD(pDevice->PortOffset + MAC_REG_TSFOFST, (u32)qwTSFOffset);
373 VNSvOutPortD(pDevice->PortOffset + MAC_REG_TSFOFST + 4, (u32)(qwTSFOffset >> 32)); 377 VNSvOutPortD(pDevice->PortOffset + MAC_REG_TSFOFST + 4, (u32)(qwTSFOffset >> 32));
diff --git a/drivers/staging/vt6655/card.h b/drivers/staging/vt6655/card.h
index 2dfc41952271..16cca49e680a 100644
--- a/drivers/staging/vt6655/card.h
+++ b/drivers/staging/vt6655/card.h
@@ -83,7 +83,7 @@ bool CARDbRadioPowerOff(struct vnt_private *);
83bool CARDbRadioPowerOn(struct vnt_private *); 83bool CARDbRadioPowerOn(struct vnt_private *);
84bool CARDbSetPhyParameter(struct vnt_private *, u8); 84bool CARDbSetPhyParameter(struct vnt_private *, u8);
85bool CARDbUpdateTSF(struct vnt_private *, unsigned char byRxRate, 85bool CARDbUpdateTSF(struct vnt_private *, unsigned char byRxRate,
86 u64 qwBSSTimestamp, u64 qwLocalTSF); 86 u64 qwBSSTimestamp);
87bool CARDbSetBeaconPeriod(struct vnt_private *, unsigned short wBeaconInterval); 87bool CARDbSetBeaconPeriod(struct vnt_private *, unsigned short wBeaconInterval);
88 88
89#endif /* __CARD_H__ */ 89#endif /* __CARD_H__ */
diff --git a/drivers/staging/vt6655/device_main.c b/drivers/staging/vt6655/device_main.c
index 4bb4f8ee4132..0343ae386f03 100644
--- a/drivers/staging/vt6655/device_main.c
+++ b/drivers/staging/vt6655/device_main.c
@@ -912,7 +912,11 @@ static int vnt_int_report_rate(struct vnt_private *priv,
912 912
913 if (!(tsr1 & TSR1_TERR)) { 913 if (!(tsr1 & TSR1_TERR)) {
914 info->status.rates[0].idx = idx; 914 info->status.rates[0].idx = idx;
915 info->flags |= IEEE80211_TX_STAT_ACK; 915
916 if (info->flags & IEEE80211_TX_CTL_NO_ACK)
917 info->flags |= IEEE80211_TX_STAT_NOACK_TRANSMITTED;
918 else
919 info->flags |= IEEE80211_TX_STAT_ACK;
916 } 920 }
917 921
918 return 0; 922 return 0;
@@ -937,9 +941,6 @@ static int device_tx_srv(struct vnt_private *pDevice, unsigned int uIdx)
937 /* Only the status of first TD in the chain is correct */ 941 /* Only the status of first TD in the chain is correct */
938 if (pTD->m_td1TD1.byTCR & TCR_STP) { 942 if (pTD->m_td1TD1.byTCR & TCR_STP) {
939 if ((pTD->pTDInfo->byFlags & TD_FLAGS_NETIF_SKB) != 0) { 943 if ((pTD->pTDInfo->byFlags & TD_FLAGS_NETIF_SKB) != 0) {
940
941 vnt_int_report_rate(pDevice, pTD->pTDInfo, byTsr0, byTsr1);
942
943 if (!(byTsr1 & TSR1_TERR)) { 944 if (!(byTsr1 & TSR1_TERR)) {
944 if (byTsr0 != 0) { 945 if (byTsr0 != 0) {
945 pr_debug(" Tx[%d] OK but has error. tsr1[%02X] tsr0[%02X]\n", 946 pr_debug(" Tx[%d] OK but has error. tsr1[%02X] tsr0[%02X]\n",
@@ -958,6 +959,9 @@ static int device_tx_srv(struct vnt_private *pDevice, unsigned int uIdx)
958 (int)uIdx, byTsr1, byTsr0); 959 (int)uIdx, byTsr1, byTsr0);
959 } 960 }
960 } 961 }
962
963 vnt_int_report_rate(pDevice, pTD->pTDInfo, byTsr0, byTsr1);
964
961 device_free_tx_buf(pDevice, pTD); 965 device_free_tx_buf(pDevice, pTD);
962 pDevice->iTDUsed[uIdx]--; 966 pDevice->iTDUsed[uIdx]--;
963 } 967 }
@@ -989,10 +993,8 @@ static void device_free_tx_buf(struct vnt_private *pDevice, PSTxDesc pDesc)
989 skb->len, DMA_TO_DEVICE); 993 skb->len, DMA_TO_DEVICE);
990 } 994 }
991 995
992 if (pTDInfo->byFlags & TD_FLAGS_NETIF_SKB) 996 if (skb)
993 ieee80211_tx_status_irqsafe(pDevice->hw, skb); 997 ieee80211_tx_status_irqsafe(pDevice->hw, skb);
994 else
995 dev_kfree_skb_irq(skb);
996 998
997 pTDInfo->skb_dma = 0; 999 pTDInfo->skb_dma = 0;
998 pTDInfo->skb = NULL; 1000 pTDInfo->skb = NULL;
@@ -1204,14 +1206,6 @@ static int vnt_tx_packet(struct vnt_private *priv, struct sk_buff *skb)
1204 if (dma_idx == TYPE_AC0DMA) 1206 if (dma_idx == TYPE_AC0DMA)
1205 head_td->pTDInfo->byFlags = TD_FLAGS_NETIF_SKB; 1207 head_td->pTDInfo->byFlags = TD_FLAGS_NETIF_SKB;
1206 1208
1207 priv->iTDUsed[dma_idx]++;
1208
1209 /* Take ownership */
1210 wmb();
1211 head_td->m_td0TD0.f1Owner = OWNED_BY_NIC;
1212
1213 /* get Next */
1214 wmb();
1215 priv->apCurrTD[dma_idx] = head_td->next; 1209 priv->apCurrTD[dma_idx] = head_td->next;
1216 1210
1217 spin_unlock_irqrestore(&priv->lock, flags); 1211 spin_unlock_irqrestore(&priv->lock, flags);
@@ -1232,11 +1226,18 @@ static int vnt_tx_packet(struct vnt_private *priv, struct sk_buff *skb)
1232 1226
1233 head_td->buff_addr = cpu_to_le32(head_td->pTDInfo->skb_dma); 1227 head_td->buff_addr = cpu_to_le32(head_td->pTDInfo->skb_dma);
1234 1228
1229 /* Poll Transmit the adapter */
1230 wmb();
1231 head_td->m_td0TD0.f1Owner = OWNED_BY_NIC;
1232 wmb(); /* second memory barrier */
1233
1235 if (head_td->pTDInfo->byFlags & TD_FLAGS_NETIF_SKB) 1234 if (head_td->pTDInfo->byFlags & TD_FLAGS_NETIF_SKB)
1236 MACvTransmitAC0(priv->PortOffset); 1235 MACvTransmitAC0(priv->PortOffset);
1237 else 1236 else
1238 MACvTransmit0(priv->PortOffset); 1237 MACvTransmit0(priv->PortOffset);
1239 1238
1239 priv->iTDUsed[dma_idx]++;
1240
1240 spin_unlock_irqrestore(&priv->lock, flags); 1241 spin_unlock_irqrestore(&priv->lock, flags);
1241 1242
1242 return 0; 1243 return 0;
@@ -1416,9 +1417,16 @@ static void vnt_bss_info_changed(struct ieee80211_hw *hw,
1416 1417
1417 priv->current_aid = conf->aid; 1418 priv->current_aid = conf->aid;
1418 1419
1419 if (changed & BSS_CHANGED_BSSID) 1420 if (changed & BSS_CHANGED_BSSID) {
1421 unsigned long flags;
1422
1423 spin_lock_irqsave(&priv->lock, flags);
1424
1420 MACvWriteBSSIDAddress(priv->PortOffset, (u8 *)conf->bssid); 1425 MACvWriteBSSIDAddress(priv->PortOffset, (u8 *)conf->bssid);
1421 1426
1427 spin_unlock_irqrestore(&priv->lock, flags);
1428 }
1429
1422 if (changed & BSS_CHANGED_BASIC_RATES) { 1430 if (changed & BSS_CHANGED_BASIC_RATES) {
1423 priv->basic_rates = conf->basic_rates; 1431 priv->basic_rates = conf->basic_rates;
1424 1432
@@ -1477,7 +1485,7 @@ static void vnt_bss_info_changed(struct ieee80211_hw *hw,
1477 if (changed & BSS_CHANGED_ASSOC && priv->op_mode != NL80211_IFTYPE_AP) { 1485 if (changed & BSS_CHANGED_ASSOC && priv->op_mode != NL80211_IFTYPE_AP) {
1478 if (conf->assoc) { 1486 if (conf->assoc) {
1479 CARDbUpdateTSF(priv, conf->beacon_rate->hw_value, 1487 CARDbUpdateTSF(priv, conf->beacon_rate->hw_value,
1480 conf->sync_device_ts, conf->sync_tsf); 1488 conf->sync_tsf);
1481 1489
1482 CARDbSetBeaconPeriod(priv, conf->beacon_int); 1490 CARDbSetBeaconPeriod(priv, conf->beacon_int);
1483 1491
diff --git a/drivers/staging/vt6656/rxtx.c b/drivers/staging/vt6656/rxtx.c
index f6c2cf8590c4..5c589962a1e8 100644
--- a/drivers/staging/vt6656/rxtx.c
+++ b/drivers/staging/vt6656/rxtx.c
@@ -805,10 +805,18 @@ int vnt_tx_packet(struct vnt_private *priv, struct sk_buff *skb)
805 vnt_schedule_command(priv, WLAN_CMD_SETPOWER); 805 vnt_schedule_command(priv, WLAN_CMD_SETPOWER);
806 } 806 }
807 807
808 if (current_rate > RATE_11M) 808 if (current_rate > RATE_11M) {
809 pkt_type = priv->packet_type; 809 if (info->band == IEEE80211_BAND_5GHZ) {
810 else 810 pkt_type = PK_TYPE_11A;
811 } else {
812 if (tx_rate->flags & IEEE80211_TX_RC_USE_CTS_PROTECT)
813 pkt_type = PK_TYPE_11GB;
814 else
815 pkt_type = PK_TYPE_11GA;
816 }
817 } else {
811 pkt_type = PK_TYPE_11B; 818 pkt_type = PK_TYPE_11B;
819 }
812 820
813 spin_lock_irqsave(&priv->lock, flags); 821 spin_lock_irqsave(&priv->lock, flags);
814 822