[PATCH V2 23/26] staging: wilc1000: fix bug on p2p connection

2016-01-24 Thread Glen Lee
In case of action frame, size -7 is correct, but in this case, size should be
used as it is.

Signed-off-by: Glen Lee 
---
 drivers/staging/wilc1000/wilc_wfi_cfgoperations.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/staging/wilc1000/wilc_wfi_cfgoperations.c 
b/drivers/staging/wilc1000/wilc_wfi_cfgoperations.c
index 8930d1c..5f7f5e5 100644
--- a/drivers/staging/wilc1000/wilc_wfi_cfgoperations.c
+++ b/drivers/staging/wilc1000/wilc_wfi_cfgoperations.c
@@ -1728,7 +1728,7 @@ void WILC_WFI_p2p_rx (struct net_device *dev, u8 *buff, 
u32 size)
}
}
 
-   cfg80211_rx_mgmt(priv->wdev, s32Freq, 0, buff, size - 7, 0);
+   cfg80211_rx_mgmt(priv->wdev, s32Freq, 0, buff, size, 0);
}
 }
 
-- 
1.9.1

--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH V2 24/26] staging: wilc1000: add ops tx power in cfg80211

2016-01-24 Thread Glen Lee
This patch implements set_tx_power and get_tx_power of cfg80211_ops.
In addition, Id of HOST_IF_MSG_DEL_ALL_RX_BA_SESSIONS is changed with 37.

Signed-off-by: Glen Lee 
---
Changes in V2:
 - changes s32 type of ret with int and do not initialize with bogus value
 - remove unneeded print statement
 - remove unneeded type casting
 - fix checkpatch ERROR: space required before the open parenthesis
 - fix checkpatch ERROR: space required after that ','
 - fix checkpatch ERROR: space prohibited before that ','
---
 drivers/staging/wilc1000/host_interface.c | 88 ++-
 drivers/staging/wilc1000/host_interface.h |  2 +
 drivers/staging/wilc1000/wilc_wfi_cfgoperations.c | 35 +
 drivers/staging/wilc1000/wilc_wlan_if.h   |  1 +
 4 files changed, 125 insertions(+), 1 deletion(-)

diff --git a/drivers/staging/wilc1000/host_interface.c 
b/drivers/staging/wilc1000/host_interface.c
index 6072d8f..9112f6d 100644
--- a/drivers/staging/wilc1000/host_interface.c
+++ b/drivers/staging/wilc1000/host_interface.c
@@ -46,7 +46,9 @@
 #define HOST_IF_MSG_DEL_BA_SESSION  34
 #define HOST_IF_MSG_Q_IDLE  35
 #define HOST_IF_MSG_DEL_ALL_STA 36
-#define HOST_IF_MSG_DEL_ALL_RX_BA_SESSIONS  34
+#define HOST_IF_MSG_DEL_ALL_RX_BA_SESSIONS  37
+#define HOST_IF_MSG_SET_TX_POWER   38
+#define HOST_IF_MSG_GET_TX_POWER   39
 #define HOST_IF_MSG_EXIT100
 
 #define HOST_IF_SCAN_TIMEOUT4000
@@ -166,6 +168,10 @@ struct sta_inactive_t {
u8 mac[6];
 };
 
+struct tx_power {
+   u8 tx_pwr;
+};
+
 union message_body {
struct scan_attr scan_info;
struct connect_attr con_info;
@@ -191,6 +197,7 @@ union message_body {
struct reg_frame reg_frame;
char *data;
struct del_all_sta del_all_sta_info;
+   struct tx_power tx_power;
 };
 
 struct host_if_msg {
@@ -2787,6 +2794,40 @@ static s32 Handle_DelAllRxBASessions(struct wilc_vif 
*vif,
return result;
 }
 
+static void handle_set_tx_pwr(struct wilc_vif *vif, u8 tx_pwr)
+{
+   int ret;
+   struct wid wid;
+
+   wid.id = (u16)WID_TX_POWER;
+   wid.type = WID_CHAR;
+   wid.val = &tx_pwr;
+   wid.size = sizeof(char);
+
+   ret = wilc_send_config_pkt(vif->wilc, SET_CFG, &wid, 1,
+wilc_get_vif_idx(vif));
+   if (ret)
+   netdev_err(vif->ndev, "Failed to set TX PWR\n");
+}
+
+static void handle_get_tx_pwr(struct wilc_vif *vif, u8 *tx_pwr)
+{
+   s32 ret = 0;
+   struct wid wid;
+
+   wid.id = (u16)WID_TX_POWER;
+   wid.type = WID_CHAR;
+   wid.val = (s8 *)tx_pwr;
+   wid.size = sizeof(char);
+
+   ret = wilc_send_config_pkt(vif->wilc, GET_CFG, &wid, 1,
+wilc_get_vif_idx(vif));
+   if (ret)
+   netdev_err(vif->ndev, "Failed to get TX PWR\n");
+
+   up(&hif_sema_wait_response);
+}
+
 static int hostIFthread(void *pvArg)
 {
u32 u32Ret;
@@ -2990,6 +3031,13 @@ static int hostIFthread(void *pvArg)
Handle_DelAllSta(msg.vif, &msg.body.del_all_sta_info);
break;
 
+   case HOST_IF_MSG_SET_TX_POWER:
+   handle_set_tx_pwr(msg.vif, msg.body.tx_power.tx_pwr);
+   break;
+
+   case HOST_IF_MSG_GET_TX_POWER:
+   handle_get_tx_pwr(msg.vif, &msg.body.tx_power.tx_pwr);
+   break;
default:
PRINT_ER("[Host Interface] undefined Received Msg 
ID\n");
break;
@@ -4608,3 +4656,41 @@ static s32 host_int_get_ipaddress(struct wilc_vif *vif,
 
return result;
 }
+
+int wilc_set_tx_power(struct wilc_vif *vif, u8 tx_power)
+{
+   int ret = 0;
+   struct host_if_msg msg;
+
+   memset(&msg, 0, sizeof(struct host_if_msg));
+
+   msg.id = HOST_IF_MSG_SET_TX_POWER;
+   msg.body.tx_power.tx_pwr = tx_power;
+   msg.vif = vif;
+
+   ret = wilc_mq_send(&hif_msg_q, &msg, sizeof(struct host_if_msg));
+   if (ret)
+   netdev_err(vif->ndev, "wilc_mq_send fail\n");
+
+   return ret;
+}
+
+int wilc_get_tx_power(struct wilc_vif *vif, u8 *tx_power)
+{
+   int ret = 0;
+   struct host_if_msg msg;
+
+   memset(&msg, 0, sizeof(struct host_if_msg));
+
+   msg.id = HOST_IF_MSG_GET_TX_POWER;
+   msg.vif = vif;
+
+   ret = wilc_mq_send(&hif_msg_q, &msg, sizeof(struct host_if_msg));
+   if (ret)
+   netdev_err(vif->ndev, "Failed to get TX PWR\n");
+
+   down(&hif_sema_wait_response);
+   *tx_power = msg.body.tx_power.tx_pwr;
+
+   return ret;
+}
diff --git a/drivers/staging/wilc1000/host_interface.h 
b/drivers/staging/wilc1000/host_interface.h
index 2893b2e..7724ade 100644
--- a/drivers/staging/wilc1000/host_interface.h
+++ b/drivers/staging/wilc1000/host_interface.h
@@ -3

[PATCH V2 22/26] staging: wilc1000: disable power save when AP mode

2016-01-24 Thread Glen Lee
This patch disables power save mode in case of AP mode.

Signed-off-by: Glen Lee 
---
 drivers/staging/wilc1000/wilc_wfi_cfgoperations.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/staging/wilc1000/wilc_wfi_cfgoperations.c 
b/drivers/staging/wilc1000/wilc_wfi_cfgoperations.c
index d3ad098..8930d1c 100644
--- a/drivers/staging/wilc1000/wilc_wfi_cfgoperations.c
+++ b/drivers/staging/wilc1000/wilc_wfi_cfgoperations.c
@@ -2203,6 +2203,7 @@ static int start_ap(struct wiphy *wiphy, struct 
net_device *dev,
PRINT_ER("Error in setting channel\n");
 
wilc_wlan_set_bssid(dev, wl->vif[vif->u8IfIdx]->src_addr, AP_MODE);
+   wilc_set_power_mgmt(vif, 0, 0);
 
s32Error = wilc_add_beacon(vif, settings->beacon_interval,
   settings->dtim_period, beacon->head_len,
-- 
1.9.1

--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH V2 26/26] staging: wilc1000: get mac address after setting drv handler

2016-01-24 Thread Glen Lee
This patch moves wilc_get_mac_address and address memcpy function after
calling wilc_set_wif_drv_handler to get selected mac address.

Signed-off-by: Glen Lee 
---
 drivers/staging/wilc1000/linux_wlan.c | 9 +
 1 file changed, 5 insertions(+), 4 deletions(-)

diff --git a/drivers/staging/wilc1000/linux_wlan.c 
b/drivers/staging/wilc1000/linux_wlan.c
index e72ef39..8b8bf47 100644
--- a/drivers/staging/wilc1000/linux_wlan.c
+++ b/drivers/staging/wilc1000/linux_wlan.c
@@ -1018,12 +1018,8 @@ int wilc_mac_open(struct net_device *ndev)
return ret;
}
 
-   wilc_get_mac_address(vif, mac_add);
-   PRINT_D(INIT_DBG, "Mac address: %pM\n", mac_add);
-
for (i = 0; i < wl->vif_num; i++) {
if (ndev == wl->vif[i]->ndev) {
-   memcpy(wl->vif[i]->src_addr, mac_add, ETH_ALEN);
if (vif->iftype == AP_MODE) {
wilc_set_wfi_drv_handler(vif,
 wilc_get_vif_idx(vif),
@@ -1044,6 +1040,11 @@ int wilc_mac_open(struct net_device *ndev)
 1);
}
wilc_set_operation_mode(vif, vif->iftype);
+
+   wilc_get_mac_address(vif, mac_add);
+   netdev_dbg(ndev, "Mac address: %pM\n", mac_add);
+   memcpy(wl->vif[i]->src_addr, mac_add, ETH_ALEN);
+
break;
}
}
-- 
1.9.1

--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH V2 20/26] staging: wilc1000: remove define TCP_ACK_FILTER

2016-01-24 Thread Glen Lee
This patch removes define TCP_ACK_FILTER and use it's feature codes.
Add argument wilc to wilc_wlan_txq_remove because compile error happens.

Signed-off-by: Glen Lee 
---
 drivers/staging/wilc1000/Makefile|  1 -
 drivers/staging/wilc1000/wilc_wlan.c | 22 ++
 2 files changed, 2 insertions(+), 21 deletions(-)

diff --git a/drivers/staging/wilc1000/Makefile 
b/drivers/staging/wilc1000/Makefile
index 90c3760..acc3f3e 100644
--- a/drivers/staging/wilc1000/Makefile
+++ b/drivers/staging/wilc1000/Makefile
@@ -4,7 +4,6 @@ ccflags-y += -DFIRMWARE_1002=\"atmel/wilc1002_firmware.bin\" \
-DFIRMWARE_1003=\"atmel/wilc1003_firmware.bin\"
 
 ccflags-y += -I$(src)/ -DWILC_ASIC_A0 -DWILC_DEBUGFS
-#ccflags-y += -DTCP_ACK_FILTER
 
 wilc1000-objs := wilc_wfi_cfgoperations.o linux_wlan.o linux_mon.o \
wilc_msgqueue.o \
diff --git a/drivers/staging/wilc1000/wilc_wlan.c 
b/drivers/staging/wilc1000/wilc_wlan.c
index e0696505..337a1ba 100644
--- a/drivers/staging/wilc1000/wilc_wlan.c
+++ b/drivers/staging/wilc1000/wilc_wlan.c
@@ -36,8 +36,7 @@ static inline void release_bus(struct wilc *wilc, 
BUS_RELEASE_T release)
mutex_unlock(&wilc->hif_cs);
 }
 
-#ifdef TCP_ACK_FILTER
-static void wilc_wlan_txq_remove(struct txq_entry_t *tqe)
+static void wilc_wlan_txq_remove(struct wilc *wilc, struct txq_entry_t *tqe)
 {
 
if (tqe == wilc->txq_head) {
@@ -54,7 +53,6 @@ static void wilc_wlan_txq_remove(struct txq_entry_t *tqe)
}
wilc->txq_entries -= 1;
 }
-#endif
 
 static struct txq_entry_t *
 wilc_wlan_txq_remove_from_head(struct net_device *dev)
@@ -146,7 +144,6 @@ static int wilc_wlan_txq_add_to_head(struct wilc *wilc, 
struct txq_entry_t *tqe)
return 0;
 }
 
-#ifdef TCP_ACK_FILTER
 struct ack_session_info;
 struct ack_session_info {
u32 seq_num;
@@ -308,7 +305,7 @@ static int wilc_wlan_txq_filter_dup_tcp_ack(struct 
net_device *dev)
pending_acks_info[i].ack_num);
tqe = pending_acks_info[i].txqe;
if (tqe) {
-   wilc_wlan_txq_remove(tqe);
+   wilc_wlan_txq_remove(wilc, tqe);
tqe->status = 1;
if (tqe->tx_complete_func)
tqe->tx_complete_func(tqe->priv,
@@ -335,7 +332,6 @@ static int wilc_wlan_txq_filter_dup_tcp_ack(struct 
net_device *dev)
 
return 1;
 }
-#endif
 
 static bool enabled = false;
 
@@ -344,12 +340,10 @@ void wilc_enable_tcp_ack_filter(bool value)
enabled = value;
 }
 
-#ifdef TCP_ACK_FILTER
 static bool is_tcp_ack_filter_enabled(void)
 {
return enabled;
 }
-#endif
 
 static int wilc_wlan_txq_add_cfg_pkt(struct wilc *wilc, u8 *buffer, u32 
buffer_size)
 {
@@ -373,9 +367,7 @@ static int wilc_wlan_txq_add_cfg_pkt(struct wilc *wilc, u8 
*buffer, u32 buffer_s
tqe->buffer_size = buffer_size;
tqe->tx_complete_func = NULL;
tqe->priv = NULL;
-#ifdef TCP_ACK_FILTER
tqe->tcp_pending_ack_idx = NOT_TCP_ACK;
-#endif
PRINT_D(TX_DBG, "Adding the config packet at the Queue tail\n");
 
if (wilc_wlan_txq_add_to_head(wilc, tqe))
@@ -406,11 +398,9 @@ int wilc_wlan_txq_add_net_pkt(struct net_device *dev, void 
*priv, u8 *buffer,
tqe->priv = priv;
 
PRINT_D(TX_DBG, "Adding mgmt packet at the Queue tail\n");
-#ifdef TCP_ACK_FILTER
tqe->tcp_pending_ack_idx = NOT_TCP_ACK;
if (is_tcp_ack_filter_enabled())
tcp_process(dev, tqe);
-#endif
wilc_wlan_txq_add_to_tail(dev, tqe);
return wilc->txq_entries;
 }
@@ -436,9 +426,7 @@ int wilc_wlan_txq_add_mgmt_pkt(struct net_device *dev, void 
*priv, u8 *buffer,
tqe->buffer_size = buffer_size;
tqe->tx_complete_func = func;
tqe->priv = priv;
-#ifdef TCP_ACK_FILTER
tqe->tcp_pending_ack_idx = NOT_TCP_ACK;
-#endif
PRINT_D(TX_DBG, "Adding Network packet at the Queue tail\n");
wilc_wlan_txq_add_to_tail(dev, tqe);
return 1;
@@ -643,9 +631,7 @@ int wilc_wlan_handle_txq(struct net_device *dev, u32 
*txq_count)
 
wilc_lock_timeout(wilc, &wilc->txq_add_to_head_cs,
CFG_PKTS_TIMEOUT);
-#ifdef TCP_ACK_FILTER
wilc_wlan_txq_filter_dup_tcp_ack(dev);
-#endif
PRINT_D(TX_DBG, "Getting the head of the TxQ\n");
tqe = wilc_wlan_txq_get_first(wilc);
i = 0;
@@ -829,10 +815,8 @@ int wilc_wlan_handle_txq(struct net_device *dev, u32 
*txq_count)
if (tqe->tx_complete_func)
tqe->tx_complete_func(tqe->priv,
  tqe->status);
-   #ifdef TCP_ACK_FILTER
if (tqe->tcp_pending_ack_idx != NOT_TCP_ACK)
 

[PATCH V2 25/26] staging: wilc1000: fix WEP security bug

2016-01-24 Thread Glen Lee
Station cannot connect to soft AP mode wilc when it is configured for WEP
security. This patch fixes it by setting the key index within the key value and
change the last else condition with DEFAULTKEY action case, and also do not use
WILC_WFI_wep_default index to set wep key id.

Signed-off-by: Glen Lee 
---
 drivers/staging/wilc1000/host_interface.c | 27 +++
 drivers/staging/wilc1000/wilc_wfi_cfgoperations.c |  9 +---
 drivers/staging/wilc1000/wilc_wfi_netdevice.h |  1 -
 3 files changed, 14 insertions(+), 23 deletions(-)

diff --git a/drivers/staging/wilc1000/host_interface.c 
b/drivers/staging/wilc1000/host_interface.c
index 9112f6d..031d0b4 100644
--- a/drivers/staging/wilc1000/host_interface.c
+++ b/drivers/staging/wilc1000/host_interface.c
@@ -1741,14 +1741,7 @@ static int Handle_Key(struct wilc_vif *vif,
strWIDList[1].size = sizeof(char);
strWIDList[1].val = (s8 
*)&pstrHostIFkeyAttr->attr.wep.auth_type;
 
-   strWIDList[2].id = (u16)WID_KEY_ID;
-   strWIDList[2].type = WID_CHAR;
-
-   strWIDList[2].val = (s8 
*)&pstrHostIFkeyAttr->attr.wep.index;
-   strWIDList[2].size = sizeof(char);
-
-   pu8keybuf = kmemdup(pstrHostIFkeyAttr->attr.wep.key,
-   pstrHostIFkeyAttr->attr.wep.key_len,
+   pu8keybuf = kmalloc(pstrHostIFkeyAttr->attr.wep.key_len 
+ 2,
GFP_KERNEL);
 
if (pu8keybuf == NULL) {
@@ -1756,15 +1749,21 @@ static int Handle_Key(struct wilc_vif *vif,
return -ENOMEM;
}
 
+   pu8keybuf[0] = pstrHostIFkeyAttr->attr.wep.index;
+   pu8keybuf[1] = pstrHostIFkeyAttr->attr.wep.key_len;
+
+   memcpy(&pu8keybuf[2], pstrHostIFkeyAttr->attr.wep.key,
+  pstrHostIFkeyAttr->attr.wep.key_len);
+
kfree(pstrHostIFkeyAttr->attr.wep.key);
 
-   strWIDList[3].id = (u16)WID_WEP_KEY_VALUE;
-   strWIDList[3].type = WID_STR;
-   strWIDList[3].size = 
pstrHostIFkeyAttr->attr.wep.key_len;
-   strWIDList[3].val = (s8 *)pu8keybuf;
+   strWIDList[2].id = (u16)WID_WEP_KEY_VALUE;
+   strWIDList[2].type = WID_STR;
+   strWIDList[2].size = 
pstrHostIFkeyAttr->attr.wep.key_len + 2;
+   strWIDList[2].val = (s8 *)pu8keybuf;
 
result = wilc_send_config_pkt(vif->wilc, SET_CFG,
-   strWIDList, 4,
+   strWIDList, 3,
wilc_get_vif_idx(vif));
kfree(pu8keybuf);
} else if (pstrHostIFkeyAttr->action & ADDKEY) {
@@ -1801,7 +1800,7 @@ static int Handle_Key(struct wilc_vif *vif,
result = wilc_send_config_pkt(vif->wilc, SET_CFG,
&wid, 1,
wilc_get_vif_idx(vif));
-   } else {
+   } else if (pstrHostIFkeyAttr->action & DEFAULTKEY) {
wid.id = (u16)WID_KEY_ID;
wid.type = WID_CHAR;
wid.val = (s8 *)&pstrHostIFkeyAttr->attr.wep.index;
diff --git a/drivers/staging/wilc1000/wilc_wfi_cfgoperations.c 
b/drivers/staging/wilc1000/wilc_wfi_cfgoperations.c
index dbfcb3b..6e7f5d6 100644
--- a/drivers/staging/wilc1000/wilc_wfi_cfgoperations.c
+++ b/drivers/staging/wilc1000/wilc_wfi_cfgoperations.c
@@ -761,7 +761,6 @@ static int connect(struct wiphy *wiphy, struct net_device 
*dev,
return s32Error;
}
 
-   priv->WILC_WFI_wep_default = 0;
memset(priv->WILC_WFI_wep_key, 0, sizeof(priv->WILC_WFI_wep_key));
memset(priv->WILC_WFI_wep_key_len, 0, 
sizeof(priv->WILC_WFI_wep_key_len));
 
@@ -788,7 +787,6 @@ static int connect(struct wiphy *wiphy, struct net_device 
*dev,
for (i = 0; i < sme->key_len; i++)
PRINT_D(CORECONFIG_DBG, "WEP Key 
Value[%d] = %d\n", i, sme->key[i]);
}
-   priv->WILC_WFI_wep_default = sme->key_idx;
priv->WILC_WFI_wep_key_len[sme->key_idx] = sme->key_len;
memcpy(priv->WILC_WFI_wep_key[sme->key_idx], sme->key, 
sme->key_len);
 
@@ -806,7 +804,6 @@ static int connect(struct wiphy *wiphy, struct net_device 
*dev,
pcgroup_encrypt_val = "WEP104";
pccipher_group = "WLAN_CIPHER_SUITE_WEP104";
 
-   priv->WILC_WFI_wep_default = sme->key_idx;
 

[PATCH V2 21/26] staging: wilc1000: increase link speed

2016-01-24 Thread Glen Lee
This patch increases throughput by enabling tcp ack filter base on checking
statistics and also handling tcp session.

Signed-off-by: Glen Lee 
---
Changes in V2:
 - fix checkpatch CHECK: Logical continuations should be on the previous line
---
 drivers/staging/wilc1000/host_interface.c | 31 +--
 drivers/staging/wilc1000/wilc_wfi_netdevice.h |  2 ++
 drivers/staging/wilc1000/wilc_wlan.c  | 27 ++-
 3 files changed, 34 insertions(+), 26 deletions(-)

diff --git a/drivers/staging/wilc1000/host_interface.c 
b/drivers/staging/wilc1000/host_interface.c
index a0603f0..6072d8f 100644
--- a/drivers/staging/wilc1000/host_interface.c
+++ b/drivers/staging/wilc1000/host_interface.c
@@ -57,6 +57,9 @@
 #define BLOCK_ACK_REQ_SIZE  0x14
 #define FALSE_FRMWR_CHANNEL100
 
+#define TCP_ACK_FILTER_LINK_SPEED_THRESH   54
+#define DEFAULT_LINK_SPEED 72
+
 struct cfg_param_attr {
struct cfg_param_val cfg_attr_info;
 };
@@ -2191,7 +2194,14 @@ static s32 Handle_GetStatistics(struct wilc_vif *vif,
if (result)
PRINT_ER("Failed to send scan paramters config packet\n");
 
-   up(&hif_sema_wait_response);
+   if (pstrStatistics->link_speed > TCP_ACK_FILTER_LINK_SPEED_THRESH &&
+   pstrStatistics->link_speed != DEFAULT_LINK_SPEED)
+   wilc_enable_tcp_ack_filter(true);
+   else if (pstrStatistics->link_speed != DEFAULT_LINK_SPEED)
+   wilc_enable_tcp_ack_filter(false);
+
+   if (pstrStatistics != &vif->wilc->dummy_statistics)
+   up(&hif_sema_wait_response);
return 0;
 }
 
@@ -3607,7 +3617,8 @@ s32 wilc_get_statistics(struct wilc_vif *vif, struct 
rf_info *pstrStatistics)
return -EFAULT;
}
 
-   down(&hif_sema_wait_response);
+   if (pstrStatistics != &vif->wilc->dummy_statistics)
+   down(&hif_sema_wait_response);
return result;
 }
 
@@ -3695,21 +3706,9 @@ static void GetPeriodicRSSI(unsigned long arg)
return;
}
 
-   if (vif->hif_drv->hif_state == HOST_IF_CONNECTED) {
-   s32 result = 0;
-   struct host_if_msg msg;
-
-   memset(&msg, 0, sizeof(struct host_if_msg));
-
-   msg.id = HOST_IF_MSG_GET_RSSI;
-   msg.vif = vif;
+   if (vif->hif_drv->hif_state == HOST_IF_CONNECTED)
+   wilc_get_statistics(vif, &vif->wilc->dummy_statistics);
 
-   result = wilc_mq_send(&hif_msg_q, &msg, sizeof(struct 
host_if_msg));
-   if (result) {
-   PRINT_ER("Failed to send get host channel param's 
message queue ");
-   return;
-   }
-   }
periodic_rssi.data = (unsigned long)vif;
mod_timer(&periodic_rssi, jiffies + msecs_to_jiffies(5000));
 }
diff --git a/drivers/staging/wilc1000/wilc_wfi_netdevice.h 
b/drivers/staging/wilc1000/wilc_wfi_netdevice.h
index 54e762ec..9f8c79e 100644
--- a/drivers/staging/wilc1000/wilc_wfi_netdevice.h
+++ b/drivers/staging/wilc1000/wilc_wfi_netdevice.h
@@ -217,6 +217,8 @@ struct wilc {
 
struct device *dev;
bool suspend_event;
+
+   struct rf_info dummy_statistics;
 };
 
 struct WILC_WFI_mon_priv {
diff --git a/drivers/staging/wilc1000/wilc_wlan.c 
b/drivers/staging/wilc1000/wilc_wlan.c
index 337a1ba..22740d8 100644
--- a/drivers/staging/wilc1000/wilc_wlan.c
+++ b/drivers/staging/wilc1000/wilc_wlan.c
@@ -178,19 +178,21 @@ static inline int init_tcp_tracking(void)
 
 static inline int add_tcp_session(u32 src_prt, u32 dst_prt, u32 seq)
 {
-   ack_session_info[tcp_session].seq_num = seq;
-   ack_session_info[tcp_session].bigger_ack_num = 0;
-   ack_session_info[tcp_session].src_port = src_prt;
-   ack_session_info[tcp_session].dst_port = dst_prt;
-   tcp_session++;
-
+   if (tcp_session < 2 * MAX_TCP_SESSION) {
+   ack_session_info[tcp_session].seq_num = seq;
+   ack_session_info[tcp_session].bigger_ack_num = 0;
+   ack_session_info[tcp_session].src_port = src_prt;
+   ack_session_info[tcp_session].dst_port = dst_prt;
+   tcp_session++;
+   }
PRINT_D(TCP_ENH, "TCP Session %d to Ack %d\n", tcp_session, seq);
return 0;
 }
 
 static inline int update_tcp_session(u32 index, u32 ack)
 {
-   if (ack > ack_session_info[index].bigger_ack_num)
+   if (index < 2 * MAX_TCP_SESSION &&
+   ack > ack_session_info[index].bigger_ack_num)
ack_session_info[index].bigger_ack_num = ack;
return 0;
 }
@@ -198,7 +200,7 @@ static inline int update_tcp_session(u32 index, u32 ack)
 static inline int add_tcp_pending_ack(u32 ack, u32 session_index,
  struct txq_entry_t *txqe)
 {
-   if (pending_acks < MAX_PENDING_ACKS) {
+   if (pending_base + pending_acks < MAX_PENDING_ACKS) {
 

[PATCH V2 17/26] staging: wilc1000: ignore power save

2016-01-24 Thread Glen Lee
If two interfaces are connected and it is required to enable power save then
ignore the request.

Signed-off-by: Glen Lee 
---
 drivers/staging/wilc1000/host_interface.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/drivers/staging/wilc1000/host_interface.c 
b/drivers/staging/wilc1000/host_interface.c
index bc8357d..a0603f0 100644
--- a/drivers/staging/wilc1000/host_interface.c
+++ b/drivers/staging/wilc1000/host_interface.c
@@ -4342,6 +4342,9 @@ s32 wilc_set_power_mgmt(struct wilc_vif *vif, bool 
bIsEnabled, u32 u32Timeout)
return -EFAULT;
}
 
+   if (wilc_wlan_get_num_conn_ifcs(vif->wilc) == 2 && bIsEnabled)
+   return 0;
+
PRINT_D(HOSTINF_DBG, "Setting Power management message queue params\n");
 
memset(&msg, 0, sizeof(struct host_if_msg));
-- 
1.9.1

--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH V2 19/26] staging: wilc1000: tcp_process: fix a build warning

2016-01-24 Thread Glen Lee
This patch fixes build warning "flags is used uninitialized" when
TCP_ACK_FILTER is defined.

Fixes: 562ed3f1f78a ("staging/wilc1000: pass struct wilc to most linux_wlan.c 
functions")
Signed-off-by: Glen Lee 
---
 drivers/staging/wilc1000/wilc_wlan.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/staging/wilc1000/wilc_wlan.c 
b/drivers/staging/wilc1000/wilc_wlan.c
index cc487d8..e0696505 100644
--- a/drivers/staging/wilc1000/wilc_wlan.c
+++ b/drivers/staging/wilc1000/wilc_wlan.c
@@ -234,6 +234,7 @@ static inline int tcp_process(struct net_device *dev, 
struct txq_entry_t *tqe)
vif = netdev_priv(dev);
wilc = vif->wilc;
 
+   spin_lock_irqsave(&wilc->txq_spinlock, flags);
 
eth_hdr_ptr = &buffer[0];
h_proto = ntohs(*((unsigned short *)ð_hdr_ptr[12]));
-- 
1.9.1

--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH V2 18/26] staging: wilc1000: handle connecting error

2016-01-24 Thread Glen Lee
If connection fails, wilc1000_connecting needs to be set false also and return
immediately because goto lable 'done' doesn't do anything. Remove lable 'done'
as well.

Signed-off-by: Glen Lee 
---
 drivers/staging/wilc1000/wilc_wfi_cfgoperations.c | 13 ++---
 1 file changed, 6 insertions(+), 7 deletions(-)

diff --git a/drivers/staging/wilc1000/wilc_wfi_cfgoperations.c 
b/drivers/staging/wilc1000/wilc_wfi_cfgoperations.c
index 05ba686..d3ad098 100644
--- a/drivers/staging/wilc1000/wilc_wfi_cfgoperations.c
+++ b/drivers/staging/wilc1000/wilc_wfi_cfgoperations.c
@@ -757,8 +757,8 @@ static int connect(struct wiphy *wiphy, struct net_device 
*dev,
PRINT_D(CFG80211_DBG, "No Scan results yet\n");
else
PRINT_D(CFG80211_DBG, "Required bss not in scan 
results: Error(%d)\n", s32Error);
-
-   goto done;
+   wilc_connecting = 0;
+   return s32Error;
}
 
priv->WILC_WFI_wep_default = 0;
@@ -845,8 +845,8 @@ static int connect(struct wiphy *wiphy, struct net_device 
*dev,
} else {
s32Error = -ENOTSUPP;
PRINT_ER("Not supported cipher: Error(%d)\n", s32Error);
-
-   goto done;
+   wilc_connecting = 0;
+   return s32Error;
}
}
 
@@ -912,11 +912,10 @@ static int connect(struct wiphy *wiphy, struct net_device 
*dev,
if (s32Error != 0) {
PRINT_ER("wilc_set_join_req(): Error(%d)\n", s32Error);
s32Error = -ENOENT;
-   goto done;
+   wilc_connecting = 0;
+   return s32Error;
}
 
-done:
-
return s32Error;
 }
 
-- 
1.9.1

--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH V2 13/26] staging: wilc1000: change_virtual_intf: change codes for unified firmware

2016-01-24 Thread Glen Lee
In previous patch, we use unified firmware on wilc, which means we do not need
to download firmware again to change virtual interfaces.
There are a lot of codes to change interface and they are needless now, so
remove them except wilc_set_operation_mode function which change the mode and
wilc_set_power_mgmt which control power save.
There will be unused functions and they will be removed in later patch.

Signed-off-by: Glen Lee 
---
 drivers/staging/wilc1000/wilc_wfi_cfgoperations.c | 220 ++
 1 file changed, 11 insertions(+), 209 deletions(-)

diff --git a/drivers/staging/wilc1000/wilc_wfi_cfgoperations.c 
b/drivers/staging/wilc1000/wilc_wfi_cfgoperations.c
index 2db023f..4c18932 100644
--- a/drivers/staging/wilc1000/wilc_wfi_cfgoperations.c
+++ b/drivers/staging/wilc1000/wilc_wfi_cfgoperations.c
@@ -2098,9 +2098,6 @@ static int change_virtual_intf(struct wiphy *wiphy, 
struct net_device *dev,
 {
struct wilc_priv *priv;
struct wilc_vif *vif;
-   u8 interface_type;
-   u16 TID = 0;
-   u8 i;
struct wilc *wl;
 
vif = netdev_priv(dev);
@@ -2125,74 +2122,12 @@ static int change_virtual_intf(struct wiphy *wiphy, 
struct net_device *dev,
priv->wdev->iftype = type;
vif->monitor_flag = 0;
vif->iftype = STATION_MODE;
+   wilc_set_operation_mode(vif, STATION_MODE);
 
memset(priv->assoc_stainfo.au8Sta_AssociatedBss, 0, MAX_NUM_STA 
* ETH_ALEN);
-   interface_type = vif->iftype;
-   vif->iftype = STATION_MODE;
-
-   if (wl->initialized) {
-   wilc_del_all_rx_ba_session(vif, wl->vif[0]->bssid,
-  TID);
-   wilc_wait_msg_queue_idle();
-
-   up(&wl->cfg_event);
-
-   wilc1000_wlan_deinit(dev);
-   wilc1000_wlan_init(dev, vif);
-   wilc_initialized = 1;
-   vif->iftype = interface_type;
-
-   wilc_set_wfi_drv_handler(vif,
-wilc_get_vif_idx(wl->vif[0]));
-   wilc_set_mac_address(wl->vif[0], wl->vif[0]->src_addr);
-   wilc_set_operation_mode(vif, STATION_MODE);
-
-   if (g_wep_keys_saved) {
-   wilc_set_wep_default_keyid(wl->vif[0],
-   g_key_wep_params.key_idx);
-   wilc_add_wep_key_bss_sta(wl->vif[0],
-   g_key_wep_params.key,
-   g_key_wep_params.key_len,
-   g_key_wep_params.key_idx);
-   }
-
-   wilc_flush_join_req(vif);
-
-   if (g_ptk_keys_saved && g_gtk_keys_saved) {
-   PRINT_D(CFG80211_DBG, "ptk %x %x %x\n", 
g_key_ptk_params.key[0],
-   g_key_ptk_params.key[1],
-   g_key_ptk_params.key[2]);
-   PRINT_D(CFG80211_DBG, "gtk %x %x %x\n", 
g_key_gtk_params.key[0],
-   g_key_gtk_params.key[1],
-   g_key_gtk_params.key[2]);
-   add_key(wl->vif[0]->ndev->ieee80211_ptr->wiphy,
-   wl->vif[0]->ndev,
-   g_add_ptk_key_params.key_idx,
-   g_add_ptk_key_params.pairwise,
-   g_add_ptk_key_params.mac_addr,
-   (struct key_params 
*)(&g_key_ptk_params));
-
-   add_key(wl->vif[0]->ndev->ieee80211_ptr->wiphy,
-   wl->vif[0]->ndev,
-   g_add_gtk_key_params.key_idx,
-   g_add_gtk_key_params.pairwise,
-   g_add_gtk_key_params.mac_addr,
-   (struct key_params 
*)(&g_key_gtk_params));
-   }
-
-   if (wl->initialized){
-   for (i = 0; i < num_reg_frame; i++) {
-   PRINT_D(INIT_DBG, "Frame registering 
Type: %x - Reg: %d\n", vif->g_struct_frame_reg[i].frame_type,
-   vif->g_struct_frame_reg[i].reg);
-   wilc_frame_register(vif,
-   
vif->g_struct_frame_reg[i].frame_type,
-   
vif->g_struct_frame_reg[i].reg);
-   }
-

[PATCH V2 11/26] staging: wilc1000: set bssid with mode

2016-01-24 Thread Glen Lee
This patch add new argument mode to wilc_wlan_set_bssid and define mode in
struct wilc_vif also. The mode is used by get_if_handler function to get proper
netdevice for each mode.
The get_if_handler is changed together. Remove invalid handle codes and
add mode condition to get netdevice for the mode.

Signed-off-by: Glen Lee 
---
 drivers/staging/wilc1000/linux_wlan.c | 26 +--
 drivers/staging/wilc1000/wilc_wfi_cfgoperations.c | 13 ++--
 drivers/staging/wilc1000/wilc_wfi_netdevice.h |  3 ++-
 drivers/staging/wilc1000/wilc_wlan.h  |  1 -
 4 files changed, 19 insertions(+), 24 deletions(-)

diff --git a/drivers/staging/wilc1000/linux_wlan.c 
b/drivers/staging/wilc1000/linux_wlan.c
index 08d2cb2..2489ea3 100644
--- a/drivers/staging/wilc1000/linux_wlan.c
+++ b/drivers/staging/wilc1000/linux_wlan.c
@@ -288,26 +288,19 @@ static struct net_device *get_if_handler(struct wilc 
*wilc, u8 *mac_header)
bssid = mac_header + 10;
bssid1 = mac_header + 4;
 
-   for (i = 0; i < wilc->vif_num; i++)
-   if (!memcmp(bssid1, wilc->vif[i]->bssid, ETH_ALEN) ||
-   !memcmp(bssid, wilc->vif[i]->bssid, ETH_ALEN))
-   return wilc->vif[i]->ndev;
-
-   PRINT_INFO(INIT_DBG, "Invalide handle\n");
-   for (i = 0; i < 25; i++)
-   PRINT_D(INIT_DBG, "%02x ", mac_header[i]);
-   bssid = mac_header + 18;
-   bssid1 = mac_header + 12;
-   for (i = 0; i < wilc->vif_num; i++)
-   if (!memcmp(bssid1, wilc->vif[i]->bssid, ETH_ALEN) ||
-   !memcmp(bssid, wilc->vif[i]->bssid, ETH_ALEN))
-   return wilc->vif[i]->ndev;
+   for (i = 0; i < wilc->vif_num; i++) {
+   if (wilc->vif[i]->mode == STATION_MODE)
+   if (!memcmp(bssid, wilc->vif[i]->bssid, ETH_ALEN))
+   return wilc->vif[i]->ndev;
+   if (wilc->vif[i]->mode == AP_MODE)
+   if (!memcmp(bssid1, wilc->vif[i]->bssid, ETH_ALEN))
+   return wilc->vif[i]->ndev;
+   }
 
-   PRINT_INFO(INIT_DBG, "\n");
return NULL;
 }
 
-int wilc_wlan_set_bssid(struct net_device *wilc_netdev, u8 *bssid)
+int wilc_wlan_set_bssid(struct net_device *wilc_netdev, u8 *bssid, u8 mode)
 {
int i = 0;
int ret = -1;
@@ -320,6 +313,7 @@ int wilc_wlan_set_bssid(struct net_device *wilc_netdev, u8 
*bssid)
for (i = 0; i < wilc->vif_num; i++)
if (wilc->vif[i]->ndev == wilc_netdev) {
memcpy(wilc->vif[i]->bssid, bssid, 6);
+   wilc->vif[i]->mode = mode;
ret = 0;
break;
}
diff --git a/drivers/staging/wilc1000/wilc_wfi_cfgoperations.c 
b/drivers/staging/wilc1000/wilc_wfi_cfgoperations.c
index ecc63f4..95be39a 100644
--- a/drivers/staging/wilc1000/wilc_wfi_cfgoperations.c
+++ b/drivers/staging/wilc1000/wilc_wfi_cfgoperations.c
@@ -524,7 +524,8 @@ static void CfgConnectResult(enum conn_event 
enuConnDisconnEvent,
if ((u8MacStatus == MAC_DISCONNECTED) &&
(pstrConnectInfo->u16ConnectStatus == 
SUCCESSFUL_STATUSCODE)) {
u16ConnectStatus = WLAN_STATUS_UNSPECIFIED_FAILURE;
-   wilc_wlan_set_bssid(priv->dev, NullBssid);
+   wilc_wlan_set_bssid(priv->dev, NullBssid,
+   STATION_MODE);
eth_zero_addr(wilc_connected_ssid);
 
if (!pstrWFIDrv->p2p_connect)
@@ -577,7 +578,7 @@ static void CfgConnectResult(enum conn_event 
enuConnDisconnEvent,
p2p_recv_random = 0x00;
wilc_ie = false;
eth_zero_addr(priv->au8AssociatedBss);
-   wilc_wlan_set_bssid(priv->dev, NullBssid);
+   wilc_wlan_set_bssid(priv->dev, NullBssid, STATION_MODE);
eth_zero_addr(wilc_connected_ssid);
 
if (!pstrWFIDrv->p2p_connect)
@@ -903,7 +904,7 @@ static int connect(struct wiphy *wiphy, struct net_device 
*dev,
if (!pstrWFIDrv->p2p_connect)
wlan_channel = pstrNetworkInfo->u8channel;
 
-   wilc_wlan_set_bssid(dev, pstrNetworkInfo->au8bssid);
+   wilc_wlan_set_bssid(dev, pstrNetworkInfo->au8bssid, STATION_MODE);
 
s32Error = wilc_set_join_req(vif, pstrNetworkInfo->au8bssid, sme->ssid,
 sme->ssid_len, sme->ie, sme->ie_len,
@@ -937,7 +938,7 @@ static int disconnect(struct wiphy *wiphy, struct 
net_device *dev, u16 reason_co
pstrWFIDrv = (struct host_if_drv *)priv->hWILCWFIDrv;
if (!pstrWFIDrv->p2p_connect)
wlan_channel = INVALID_CHANNEL;
-   wilc_wlan_set_bssid(priv->dev, NullBssid);
+   wilc_wlan_set_bssid(priv->dev, NullBssid, STATION_MODE);
 
PRINT_D(CFG80211_DBG, "Disconnecting with reason code(

[PATCH V2 15/26] staging: wilc1000: wilc_set_wfi_drv_handler: add mac index

2016-01-24 Thread Glen Lee
Firmware supports sta/ap concurrency so mac index will be passed to wilc.
Remove wilc_set_wfi_drv_handler in scan and connect functions, and call
the function in ndo_open which is wilc_mac_open.
WID_SET_DRV_HANDLER value has been changed as well.

Signed-off-by: Glen Lee 
---
Changes in V2:
 - fix checkpatch CHECK: space prefferred around that '^'
---
 drivers/staging/wilc1000/host_interface.c | 11 ++-
 drivers/staging/wilc1000/host_interface.h |  3 ++-
 drivers/staging/wilc1000/linux_wlan.c | 19 +++
 drivers/staging/wilc1000/wilc_wfi_cfgoperations.c |  6 ++
 drivers/staging/wilc1000/wilc_wlan_if.h   |  2 +-
 5 files changed, 30 insertions(+), 11 deletions(-)

diff --git a/drivers/staging/wilc1000/host_interface.c 
b/drivers/staging/wilc1000/host_interface.c
index 8c77520..9ffed32 100644
--- a/drivers/staging/wilc1000/host_interface.c
+++ b/drivers/staging/wilc1000/host_interface.c
@@ -319,9 +319,9 @@ static s32 handle_set_wfi_drv_handler(struct wilc_vif *vif,
struct wid wid;
 
wid.id = (u16)WID_SET_DRV_HANDLER;
-   wid.type = WID_INT;
-   wid.val = (s8 *)&hif_drv_handler->handler;
-   wid.size = sizeof(u32);
+   wid.type = WID_STR;
+   wid.val = (s8 *)hif_drv_handler;
+   wid.size = sizeof(*hif_drv_handler);
 
result = wilc_send_config_pkt(vif->wilc, SET_CFG, &wid, 1,
  hif_drv_handler->handler);
@@ -3558,7 +3558,7 @@ int wilc_wait_msg_queue_idle(void)
return result;
 }
 
-int wilc_set_wfi_drv_handler(struct wilc_vif *vif, int index)
+int wilc_set_wfi_drv_handler(struct wilc_vif *vif, int index, u8 mac_idx)
 {
int result = 0;
struct host_if_msg msg;
@@ -3566,6 +3566,7 @@ int wilc_set_wfi_drv_handler(struct wilc_vif *vif, int 
index)
memset(&msg, 0, sizeof(struct host_if_msg));
msg.id = HOST_IF_MSG_SET_WFIDRV_HANDLER;
msg.body.drv.handler = index;
+   msg.body.drv.mac_idx = mac_idx;
msg.vif = vif;
 
result = wilc_mq_send(&hif_msg_q, &msg, sizeof(struct host_if_msg));
@@ -3906,7 +3907,7 @@ s32 wilc_deinit(struct wilc_vif *vif)
 
del_timer_sync(&hif_drv->remain_on_ch_timer);
 
-   wilc_set_wfi_drv_handler(vif, 0);
+   wilc_set_wfi_drv_handler(vif, 0, 0);
down(&hif_sema_driver);
 
if (hif_drv->usr_scan_req.scan_result) {
diff --git a/drivers/staging/wilc1000/host_interface.h 
b/drivers/staging/wilc1000/host_interface.h
index 8faac27..5794246 100644
--- a/drivers/staging/wilc1000/host_interface.h
+++ b/drivers/staging/wilc1000/host_interface.h
@@ -217,6 +217,7 @@ struct user_conn_req {
 
 struct drv_handler {
u32 handler;
+   u8 mac_idx;
 };
 
 struct op_mode {
@@ -366,7 +367,7 @@ s32 wilc_remain_on_channel(struct wilc_vif *vif, u32 
u32SessionID,
   void *pvUserArg);
 s32 wilc_listen_state_expired(struct wilc_vif *vif, u32 u32SessionID);
 s32 wilc_frame_register(struct wilc_vif *vif, u16 u16FrameType, bool bReg);
-int wilc_set_wfi_drv_handler(struct wilc_vif *vif, int index);
+int wilc_set_wfi_drv_handler(struct wilc_vif *vif, int index, u8 mac_idx);
 int wilc_set_operation_mode(struct wilc_vif *vif, u32 mode);
 
 void wilc_free_join_params(void *pJoinParams);
diff --git a/drivers/staging/wilc1000/linux_wlan.c 
b/drivers/staging/wilc1000/linux_wlan.c
index 2489ea3..e72ef39 100644
--- a/drivers/staging/wilc1000/linux_wlan.c
+++ b/drivers/staging/wilc1000/linux_wlan.c
@@ -1024,6 +1024,25 @@ int wilc_mac_open(struct net_device *ndev)
for (i = 0; i < wl->vif_num; i++) {
if (ndev == wl->vif[i]->ndev) {
memcpy(wl->vif[i]->src_addr, mac_add, ETH_ALEN);
+   if (vif->iftype == AP_MODE) {
+   wilc_set_wfi_drv_handler(vif,
+wilc_get_vif_idx(vif),
+0);
+   } else if (!wilc_wlan_get_num_conn_ifcs(wilc)) {
+   wilc_set_wfi_drv_handler(vif,
+wilc_get_vif_idx(vif),
+wilc->open_ifcs);
+   } else {
+   if (memcmp(wilc->vif[i ^ 1]->bssid,
+  wilc->vif[i ^ 1]->src_addr, 6))
+   wilc_set_wfi_drv_handler(vif,
+wilc_get_vif_idx(vif),
+0);
+   else
+   wilc_set_wfi_drv_handler(vif,
+wilc_get_vif_idx(vif),
+1);
+   }
wilc_set_operation_mode(vif, v

[PATCH V2 10/26] staging: wilc1000: remove wilc_set_machw_change_vir_if

2016-01-24 Thread Glen Lee
wilc_set_machw_change_vir_if is not used anymore since we use one unified
firmware. Instead, wilc_set_operation_mode is called when wilc_mac_open to
let the wilc use the proper firmware. Remove wilc_set_machw_change_vir_if
and it's functions calls.
In the later patch, mac index will be passed to wilc device.

Signed-off-by: Glen Lee 
---
 drivers/staging/wilc1000/linux_wlan.c |  3 +--
 drivers/staging/wilc1000/wilc_wfi_cfgoperations.c |  6 -
 drivers/staging/wilc1000/wilc_wfi_netdevice.h |  1 -
 drivers/staging/wilc1000/wilc_wlan.c  | 32 ---
 4 files changed, 1 insertion(+), 41 deletions(-)

diff --git a/drivers/staging/wilc1000/linux_wlan.c 
b/drivers/staging/wilc1000/linux_wlan.c
index 006f75f7..08d2cb2 100644
--- a/drivers/staging/wilc1000/linux_wlan.c
+++ b/drivers/staging/wilc1000/linux_wlan.c
@@ -1024,14 +1024,13 @@ int wilc_mac_open(struct net_device *ndev)
return ret;
}
 
-   wilc_set_machw_change_vir_if(ndev, false);
-
wilc_get_mac_address(vif, mac_add);
PRINT_D(INIT_DBG, "Mac address: %pM\n", mac_add);
 
for (i = 0; i < wl->vif_num; i++) {
if (ndev == wl->vif[i]->ndev) {
memcpy(wl->vif[i]->src_addr, mac_add, ETH_ALEN);
+   wilc_set_operation_mode(vif, vif->iftype);
break;
}
}
diff --git a/drivers/staging/wilc1000/wilc_wfi_cfgoperations.c 
b/drivers/staging/wilc1000/wilc_wfi_cfgoperations.c
index 5c23462..ecc63f4 100644
--- a/drivers/staging/wilc1000/wilc_wfi_cfgoperations.c
+++ b/drivers/staging/wilc1000/wilc_wfi_cfgoperations.c
@@ -1274,7 +1274,6 @@ static int del_key(struct wiphy *wiphy, struct net_device 
*netdev,
kfree(g_key_gtk_params.seq);
g_key_gtk_params.seq = NULL;
 
-   wilc_set_machw_change_vir_if(netdev, false);
}
 
if (key_index >= 0 && key_index <= 3) {
@@ -2116,10 +2115,6 @@ static int change_virtual_intf(struct wiphy *wiphy, 
struct net_device *dev,
del_timer(&wilc_during_ip_timer);
PRINT_D(GENERIC_DBG, "Changing virtual interface, enable scan\n");
 
-   if (g_ptk_keys_saved && g_gtk_keys_saved) {
-   wilc_set_machw_change_vir_if(dev, true);
-   }
-
switch (type) {
case NL80211_IFTYPE_STATION:
wilc_connecting = 0;
@@ -2261,7 +2256,6 @@ static int change_virtual_intf(struct wiphy *wiphy, 
struct net_device *dev,
}
 
refresh_scan(priv, 1, true);
-   wilc_set_machw_change_vir_if(dev, false);
 
if (wl->initialized){
for (i = 0; i < num_reg_frame; i++) {
diff --git a/drivers/staging/wilc1000/wilc_wfi_netdevice.h 
b/drivers/staging/wilc1000/wilc_wfi_netdevice.h
index cd3d21d..0d851f8 100644
--- a/drivers/staging/wilc1000/wilc_wfi_netdevice.h
+++ b/drivers/staging/wilc1000/wilc_wfi_netdevice.h
@@ -235,7 +235,6 @@ int wilc_netdev_init(struct wilc **wilc, struct device *, 
int io_type, int gpio,
 const struct wilc_hif_func *ops);
 void wilc1000_wlan_deinit(struct net_device *dev);
 void WILC_WFI_mgmt_rx(struct wilc *wilc, u8 *buff, u32 size);
-u16 wilc_set_machw_change_vir_if(struct net_device *dev, bool value);
 int wilc_wlan_get_firmware(struct net_device *dev);
 int wilc_wlan_set_bssid(struct net_device *wilc_netdev, u8 *bssid);
 
diff --git a/drivers/staging/wilc1000/wilc_wlan.c 
b/drivers/staging/wilc1000/wilc_wlan.c
index aed1dd2..cc487d8 100644
--- a/drivers/staging/wilc1000/wilc_wlan.c
+++ b/drivers/staging/wilc1000/wilc_wlan.c
@@ -1578,35 +1578,3 @@ _fail_:
 
return ret;
 }
-
-u16 wilc_set_machw_change_vir_if(struct net_device *dev, bool value)
-{
-   u16 ret;
-   u32 reg;
-   struct wilc_vif *vif;
-   struct wilc *wilc;
-
-   vif = netdev_priv(dev);
-   wilc = vif->wilc;
-
-   mutex_lock(&wilc->hif_cs);
-   ret = wilc->hif_func->hif_read_reg(wilc, WILC_CHANGING_VIR_IF,
-  ®);
-   if (!ret)
-   PRINT_ER("Error while Reading reg WILC_CHANGING_VIR_IF\n");
-
-   if (value)
-   reg |= BIT(31);
-   else
-   reg &= ~BIT(31);
-
-   ret = wilc->hif_func->hif_write_reg(wilc, WILC_CHANGING_VIR_IF,
-   reg);
-
-   if (!ret)
-   PRINT_ER("Error while writing reg WILC_CHANGING_VIR_IF\n");
-
-   mutex_unlock(&wilc->hif_cs);
-
-   return ret;
-}
-- 
1.9.1

--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH V2 12/26] staging: wilc1000: set proper bssid address

2016-01-24 Thread Glen Lee
This patch changes index 0 to index of vif which is currently beging used
because AP mode can run on any interface.

Signed-off-by: Glen Lee 
---
 drivers/staging/wilc1000/wilc_wfi_cfgoperations.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/staging/wilc1000/wilc_wfi_cfgoperations.c 
b/drivers/staging/wilc1000/wilc_wfi_cfgoperations.c
index 95be39a..2db023f 100644
--- a/drivers/staging/wilc1000/wilc_wfi_cfgoperations.c
+++ b/drivers/staging/wilc1000/wilc_wfi_cfgoperations.c
@@ -2401,7 +2401,7 @@ static int start_ap(struct wiphy *wiphy, struct 
net_device *dev,
if (s32Error != 0)
PRINT_ER("Error in setting channel\n");
 
-   wilc_wlan_set_bssid(dev, wl->vif[0]->src_addr, AP_MODE);
+   wilc_wlan_set_bssid(dev, wl->vif[vif->u8IfIdx]->src_addr, AP_MODE);
 
s32Error = wilc_add_beacon(vif, settings->beacon_interval,
   settings->dtim_period, beacon->head_len,
-- 
1.9.1

--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH V2 16/26] staging: wilc1000: remove unused functions

2016-01-24 Thread Glen Lee
This patch removes unused following functions.
wilc_del_all_rx_ba_session
wilc_flush_join_req
wilc_wait_msg_queue_idle
wilc_set_mac_address

Signed-off-by: Glen Lee 
---
 drivers/staging/wilc1000/host_interface.c | 92 ---
 drivers/staging/wilc1000/host_interface.h |  4 --
 2 files changed, 96 deletions(-)

diff --git a/drivers/staging/wilc1000/host_interface.c 
b/drivers/staging/wilc1000/host_interface.c
index 9ffed32..bc8357d 100644
--- a/drivers/staging/wilc1000/host_interface.c
+++ b/drivers/staging/wilc1000/host_interface.c
@@ -3346,25 +3346,6 @@ s32 wilc_get_mac_address(struct wilc_vif *vif, u8 
*pu8MacAddress)
return result;
 }
 
-s32 wilc_set_mac_address(struct wilc_vif *vif, u8 *pu8MacAddress)
-{
-   s32 result = 0;
-   struct host_if_msg msg;
-
-   PRINT_D(GENERIC_DBG, "mac addr = %x:%x:%x\n", pu8MacAddress[0], 
pu8MacAddress[1], pu8MacAddress[2]);
-
-   memset(&msg, 0, sizeof(struct host_if_msg));
-   msg.id = HOST_IF_MSG_SET_MAC_ADDRESS;
-   memcpy(msg.body.set_mac_info.mac_addr, pu8MacAddress, ETH_ALEN);
-   msg.vif = vif;
-
-   result = wilc_mq_send(&hif_msg_q, &msg, sizeof(struct host_if_msg));
-   if (result)
-   PRINT_ER("Failed to send message queue: Set mac address\n");
-
-   return result;
-}
-
 s32 wilc_set_join_req(struct wilc_vif *vif, u8 *pu8bssid, const u8 *pu8ssid,
  size_t ssidLen, const u8 *pu8IEs, size_t IEsLen,
  wilc_connect_result pfConnectResult, void *pvUserArg,
@@ -3432,32 +3413,6 @@ s32 wilc_set_join_req(struct wilc_vif *vif, u8 
*pu8bssid, const u8 *pu8ssid,
return result;
 }
 
-s32 wilc_flush_join_req(struct wilc_vif *vif)
-{
-   s32 result = 0;
-   struct host_if_msg msg;
-   struct host_if_drv *hif_drv = vif->hif_drv;
-
-   if (!join_req)
-   return -EFAULT;
-
-   if (!hif_drv) {
-   PRINT_ER("Driver is null\n");
-   return -EFAULT;
-   }
-
-   msg.id = HOST_IF_MSG_FLUSH_CONNECT;
-   msg.vif = vif;
-
-   result = wilc_mq_send(&hif_msg_q, &msg, sizeof(struct host_if_msg));
-   if (result) {
-   PRINT_ER("Failed to send message queue: Flush join request\n");
-   return -EFAULT;
-   }
-
-   return result;
-}
-
 s32 wilc_disconnect(struct wilc_vif *vif, u16 u16ReasonCode)
 {
s32 result = 0;
@@ -3540,24 +3495,6 @@ int wilc_set_mac_chnl_num(struct wilc_vif *vif, u8 
channel)
return 0;
 }
 
-int wilc_wait_msg_queue_idle(void)
-{
-   int result = 0;
-   struct host_if_msg msg;
-
-   memset(&msg, 0, sizeof(struct host_if_msg));
-   msg.id = HOST_IF_MSG_Q_IDLE;
-   result = wilc_mq_send(&hif_msg_q, &msg, sizeof(struct host_if_msg));
-   if (result) {
-   PRINT_ER("wilc mq send fail\n");
-   result = -EINVAL;
-   }
-
-   down(&hif_sema_wait_response);
-
-   return result;
-}
-
 int wilc_set_wfi_drv_handler(struct wilc_vif *vif, int index, u8 mac_idx)
 {
int result = 0;
@@ -4615,35 +4552,6 @@ void wilc_free_join_params(void *pJoinParams)
PRINT_ER("Unable to FREE null pointer\n");
 }
 
-s32 wilc_del_all_rx_ba_session(struct wilc_vif *vif, char *pBSSID, char TID)
-{
-   s32 result = 0;
-   struct host_if_msg msg;
-   struct ba_session_info *pBASessionInfo = &msg.body.session_info;
-   struct host_if_drv *hif_drv = vif->hif_drv;
-
-   if (!hif_drv) {
-   PRINT_ER("driver is null\n");
-   return -EFAULT;
-   }
-
-   memset(&msg, 0, sizeof(struct host_if_msg));
-
-   msg.id = HOST_IF_MSG_DEL_ALL_RX_BA_SESSIONS;
-
-   memcpy(pBASessionInfo->bssid, pBSSID, ETH_ALEN);
-   pBASessionInfo->tid = TID;
-   msg.vif = vif;
-
-   result = wilc_mq_send(&hif_msg_q, &msg, sizeof(struct host_if_msg));
-   if (result)
-   PRINT_ER("wilc_mq_send fail\n");
-
-   down(&hif_sema_wait_response);
-
-   return result;
-}
-
 s32 wilc_setup_ipaddress(struct wilc_vif *vif, u8 *u16ipadd, u8 idx)
 {
s32 result = 0;
diff --git a/drivers/staging/wilc1000/host_interface.h 
b/drivers/staging/wilc1000/host_interface.h
index 5794246..2893b2e 100644
--- a/drivers/staging/wilc1000/host_interface.h
+++ b/drivers/staging/wilc1000/host_interface.h
@@ -327,15 +327,12 @@ s32 wilc_add_tx_gtk(struct host_if_drv *hWFIDrv, u8 
u8KeyLen,
 s32 wilc_set_pmkid_info(struct wilc_vif *vif,
struct host_if_pmkid_attr *pu8PmkidInfoArray);
 s32 wilc_get_mac_address(struct wilc_vif *vif, u8 *pu8MacAddress);
-s32 wilc_set_mac_address(struct wilc_vif *vif, u8 *pu8MacAddress);
-int wilc_wait_msg_queue_idle(void);
 s32 wilc_set_start_scan_req(struct host_if_drv *hWFIDrv, u8 scanSource);
 s32 wilc_set_join_req(struct wilc_vif *vif, u8 *pu8bssid, const u8 *pu8ssid,
  size_t ssidLen, const u8 *pu8IEs, size_t IEsLen,
  wilc_connect_result pfConn

[PATCH V2 14/26] staging: wilc1000: call power save after changing mode

2016-01-24 Thread Glen Lee
host_int_set_power_mgmt should be called after changing operation mode to
work properly. Move the function below host_int_set_operation_mode.

Signed-off-by: Glen Lee 
---
 drivers/staging/wilc1000/wilc_wfi_cfgoperations.c | 10 ++
 1 file changed, 6 insertions(+), 4 deletions(-)

diff --git a/drivers/staging/wilc1000/wilc_wfi_cfgoperations.c 
b/drivers/staging/wilc1000/wilc_wfi_cfgoperations.c
index 4c18932..ff92cff 100644
--- a/drivers/staging/wilc1000/wilc_wfi_cfgoperations.c
+++ b/drivers/staging/wilc1000/wilc_wfi_cfgoperations.c
@@ -2131,8 +2131,6 @@ static int change_virtual_intf(struct wiphy *wiphy, 
struct net_device *dev,
break;
 
case NL80211_IFTYPE_P2P_CLIENT:
-   wilc_enable_ps = false;
-   wilc_set_power_mgmt(vif, 0, 0);
wilc_connecting = 0;
PRINT_D(HOSTAPD_DBG, "Interface type = 
NL80211_IFTYPE_P2P_CLIENT\n");
 
@@ -2141,6 +2139,9 @@ static int change_virtual_intf(struct wiphy *wiphy, 
struct net_device *dev,
vif->monitor_flag = 0;
vif->iftype = CLIENT_MODE;
wilc_set_operation_mode(vif, STATION_MODE);
+
+   wilc_enable_ps = false;
+   wilc_set_power_mgmt(vif, 0, 0);
break;
 
case NL80211_IFTYPE_AP:
@@ -2163,14 +2164,15 @@ static int change_virtual_intf(struct wiphy *wiphy, 
struct net_device *dev,
wilc_optaining_ip = true;
mod_timer(&wilc_during_ip_timer,
  jiffies + msecs_to_jiffies(during_ip_time));
-   wilc_set_power_mgmt(vif, 0, 0);
-   wilc_enable_ps = false;
PRINT_D(HOSTAPD_DBG, "Interface type = NL80211_IFTYPE_GO\n");
 
wilc_set_operation_mode(vif, AP_MODE);
dev->ieee80211_ptr->iftype = type;
priv->wdev->iftype = type;
vif->iftype = GO_MODE;
+
+   wilc_enable_ps = false;
+   wilc_set_power_mgmt(vif, 0, 0);
break;
 
default:
-- 
1.9.1

--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH V2 05/26] staging: wilc1000: sdio_init: add resume argument

2016-01-24 Thread Glen Lee
Part of sdio init codes should not run when sdio init function is called on
sdio resume so skip them.

Signed-off-by: Glen Lee 
---
 drivers/staging/wilc1000/wilc_sdio.c | 34 +++---
 drivers/staging/wilc1000/wilc_spi.c  |  2 +-
 drivers/staging/wilc1000/wilc_wlan.c |  2 +-
 drivers/staging/wilc1000/wilc_wlan.h |  2 +-
 4 files changed, 22 insertions(+), 18 deletions(-)

diff --git a/drivers/staging/wilc1000/wilc_sdio.c 
b/drivers/staging/wilc1000/wilc_sdio.c
index f40a527..7c20c8c 100644
--- a/drivers/staging/wilc1000/wilc_sdio.c
+++ b/drivers/staging/wilc1000/wilc_sdio.c
@@ -42,7 +42,7 @@ static wilc_sdio_t g_sdio;
 
 static int sdio_write_reg(struct wilc *wilc, u32 addr, u32 data);
 static int sdio_read_reg(struct wilc *wilc, u32 addr, u32 *data);
-static int sdio_init(struct wilc *wilc);
+static int sdio_init(struct wilc *wilc, bool resume);
 
 static void wilc_sdio_interrupt(struct sdio_func *func)
 {
@@ -196,7 +196,7 @@ static int wilc_sdio_resume(struct device *dev)
dev_info(dev, "sdio resume\n");
sdio_release_host(func);
chip_wakeup(wilc);
-   sdio_init(wilc);
+   sdio_init(wilc, true);
 
if (wilc->suspend_event)
host_wakeup_notify(wilc);
@@ -667,16 +667,17 @@ static int sdio_deinit(struct wilc *wilc)
return 1;
 }
 
-static int sdio_init(struct wilc *wilc)
+static int sdio_init(struct wilc *wilc, bool resume)
 {
struct sdio_func *func = dev_to_sdio_func(wilc->dev);
sdio_cmd52_t cmd;
int loop, ret;
u32 chipid;
 
-   memset(&g_sdio, 0, sizeof(wilc_sdio_t));
-
-   g_sdio.irq_gpio = (wilc->dev_irq_num);
+   if (!resume) {
+   memset(&g_sdio, 0, sizeof(wilc_sdio_t));
+   g_sdio.irq_gpio = (wilc->dev_irq_num);
+   }
 
/**
 *  function 0 csa enable
@@ -766,16 +767,19 @@ static int sdio_init(struct wilc *wilc)
/**
 *  make sure can read back chip id correctly
 **/
-   if (!sdio_read_reg(wilc, 0x1000, &chipid)) {
-   dev_err(&func->dev, "Fail cmd read chip id...\n");
-   goto _fail_;
+   if (!resume) {
+   if (!sdio_read_reg(wilc, 0x1000, &chipid)) {
+   dev_err(&func->dev, "Fail cmd read chip id...\n");
+   goto _fail_;
+   }
+   dev_err(&func->dev, "chipid (%08x)\n", chipid);
+   if ((chipid & 0xfff) > 0x2a0)
+   g_sdio.has_thrpt_enh3 = 1;
+   else
+   g_sdio.has_thrpt_enh3 = 0;
+   dev_info(&func->dev, "has_thrpt_enh3 = %d...\n",
+g_sdio.has_thrpt_enh3);
}
-   dev_err(&func->dev, "chipid (%08x)\n", chipid);
-   if ((chipid & 0xfff) > 0x2a0)
-   g_sdio.has_thrpt_enh3 = 1;
-   else
-   g_sdio.has_thrpt_enh3 = 0;
-   dev_info(&func->dev, "has_thrpt_enh3 = %d...\n", g_sdio.has_thrpt_enh3);
 
return 1;
 
diff --git a/drivers/staging/wilc1000/wilc_spi.c 
b/drivers/staging/wilc1000/wilc_spi.c
index 86de50c..356a446 100644
--- a/drivers/staging/wilc1000/wilc_spi.c
+++ b/drivers/staging/wilc1000/wilc_spi.c
@@ -852,7 +852,7 @@ static int _wilc_spi_deinit(struct wilc *wilc)
return 1;
 }
 
-static int wilc_spi_init(struct wilc *wilc)
+static int wilc_spi_init(struct wilc *wilc, bool resume)
 {
struct spi_device *spi = to_spi_device(wilc->dev);
u32 reg;
diff --git a/drivers/staging/wilc1000/wilc_wlan.c 
b/drivers/staging/wilc1000/wilc_wlan.c
index 8a39a05..aed1dd2 100644
--- a/drivers/staging/wilc1000/wilc_wlan.c
+++ b/drivers/staging/wilc1000/wilc_wlan.c
@@ -1530,7 +1530,7 @@ int wilc_wlan_init(struct net_device *dev)
 
wilc->quit = 0;
 
-   if (!wilc->hif_func->hif_init(wilc)) {
+   if (!wilc->hif_func->hif_init(wilc, false)) {
ret = -EIO;
goto _fail_;
}
diff --git a/drivers/staging/wilc1000/wilc_wlan.h 
b/drivers/staging/wilc1000/wilc_wlan.h
index 53e56ff..a1096ed 100644
--- a/drivers/staging/wilc1000/wilc_wlan.h
+++ b/drivers/staging/wilc1000/wilc_wlan.h
@@ -227,7 +227,7 @@ struct rxq_entry_t {
  /
 struct wilc;
 struct wilc_hif_func {
-   int (*hif_init)(struct wilc *);
+   int (*hif_init)(struct wilc *, bool resume);
int (*hif_deinit)(struct wilc *);
int (*hif_read_reg)(struct wilc *, u32, u32 *);
int (*hif_write_reg)(struct wilc *, u32, u32);
-- 
1.9.1

--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH V2 04/26] staging: wilc1000: add sdio resume/suspend

2016-01-24 Thread Glen Lee
This patch introduces sdio device suspend and resume functionality. sdio_reset
function is added to reset sdio. Remove static inline keyword from
chip_allow_sleep and chip_wakeup, and export symbols.

Signed-off-by: Glen Lee 
---
Changes in V2:
 - fix checkpatch ERROR: space required before the open parenthesis
---
 drivers/staging/wilc1000/wilc_sdio.c  | 72 +++
 drivers/staging/wilc1000/wilc_wfi_netdevice.h |  1 +
 drivers/staging/wilc1000/wilc_wlan.c  | 11 ++--
 drivers/staging/wilc1000/wilc_wlan.h  |  3 +-
 4 files changed, 82 insertions(+), 5 deletions(-)

diff --git a/drivers/staging/wilc1000/wilc_sdio.c 
b/drivers/staging/wilc1000/wilc_sdio.c
index caad876..f40a527 100644
--- a/drivers/staging/wilc1000/wilc_sdio.c
+++ b/drivers/staging/wilc1000/wilc_sdio.c
@@ -42,6 +42,7 @@ static wilc_sdio_t g_sdio;
 
 static int sdio_write_reg(struct wilc *wilc, u32 addr, u32 data);
 static int sdio_read_reg(struct wilc *wilc, u32 addr, u32 *data);
+static int sdio_init(struct wilc *wilc);
 
 static void wilc_sdio_interrupt(struct sdio_func *func)
 {
@@ -142,11 +143,82 @@ static void linux_sdio_remove(struct sdio_func *func)
wilc_netdev_cleanup(sdio_get_drvdata(func));
 }
 
+static int sdio_reset(struct wilc *wilc)
+{
+   sdio_cmd52_t cmd;
+   int ret;
+   struct sdio_func *func = dev_to_sdio_func(wilc->dev);
+
+   cmd.read_write = 1;
+   cmd.function = 0;
+   cmd.raw = 0;
+   cmd.address = 0x6;
+   cmd.data = 0x8;
+   ret = wilc_sdio_cmd52(wilc, &cmd);
+   if (ret) {
+   dev_err(&func->dev, "Fail cmd 52, reset cmd ...\n");
+   return ret;
+   }
+   return 0;
+}
+
+static int wilc_sdio_suspend(struct device *dev)
+{
+   struct sdio_func *func = dev_to_sdio_func(dev);
+   struct wilc *wilc = sdio_get_drvdata(func);
+   int ret;
+
+   dev_info(dev, "sdio suspend\n");
+   chip_wakeup(wilc);
+
+   if (!wilc->suspend_event) {
+   wilc_chip_sleep_manually(wilc);
+   } else {
+   host_sleep_notify(wilc);
+   chip_allow_sleep(wilc);
+   }
+
+   ret = sdio_reset(wilc);
+   if (ret) {
+   dev_err(&func->dev, "Fail reset sdio\n");
+   return ret;
+   }
+   sdio_claim_host(func);
+
+   return 0;
+}
+
+static int wilc_sdio_resume(struct device *dev)
+{
+   struct sdio_func *func = dev_to_sdio_func(dev);
+   struct wilc *wilc = sdio_get_drvdata(func);
+
+   dev_info(dev, "sdio resume\n");
+   sdio_release_host(func);
+   chip_wakeup(wilc);
+   sdio_init(wilc);
+
+   if (wilc->suspend_event)
+   host_wakeup_notify(wilc);
+
+   chip_allow_sleep(wilc);
+
+   return 0;
+}
+
+static const struct dev_pm_ops wilc_sdio_pm_ops = {
+   .suspend = wilc_sdio_suspend,
+   .resume = wilc_sdio_resume,
+};
+
 static struct sdio_driver wilc1000_sdio_driver = {
.name   = SDIO_MODALIAS,
.id_table   = wilc_sdio_ids,
.probe  = linux_sdio_probe,
.remove = linux_sdio_remove,
+   .drv = {
+   .pm = &wilc_sdio_pm_ops,
+   }
 };
 module_driver(wilc1000_sdio_driver,
  sdio_register_driver,
diff --git a/drivers/staging/wilc1000/wilc_wfi_netdevice.h 
b/drivers/staging/wilc1000/wilc_wfi_netdevice.h
index 98ac8ed..cd3d21d 100644
--- a/drivers/staging/wilc1000/wilc_wfi_netdevice.h
+++ b/drivers/staging/wilc1000/wilc_wfi_netdevice.h
@@ -215,6 +215,7 @@ struct wilc {
const struct firmware *firmware;
 
struct device *dev;
+   bool suspend_event;
 };
 
 struct WILC_WFI_mon_priv {
diff --git a/drivers/staging/wilc1000/wilc_wlan.c 
b/drivers/staging/wilc1000/wilc_wlan.c
index 977bd8a0..8a39a05 100644
--- a/drivers/staging/wilc1000/wilc_wlan.c
+++ b/drivers/staging/wilc1000/wilc_wlan.c
@@ -3,8 +3,6 @@
 #include "wilc_wfi_netdevice.h"
 #include "wilc_wlan_cfg.h"
 
-static inline void chip_allow_sleep(struct wilc *wilc);
-static inline void chip_wakeup(struct wilc *wilc);
 static u32 dbgflag = N_INIT | N_ERR | N_INTR | N_TXQ | N_RXQ;
 
 /* FIXME: replace with dev_debug() */
@@ -515,7 +513,7 @@ static struct rxq_entry_t *wilc_wlan_rxq_remove(struct wilc 
*wilc)
return NULL;
 }
 
-static inline void chip_allow_sleep(struct wilc *wilc)
+void chip_allow_sleep(struct wilc *wilc)
 {
u32 reg = 0;
 
@@ -524,8 +522,9 @@ static inline void chip_allow_sleep(struct wilc *wilc)
wilc->hif_func->hif_write_reg(wilc, 0xf0, reg & ~BIT(0));
wilc->hif_func->hif_write_reg(wilc, 0xfa, 0);
 }
+EXPORT_SYMBOL_GPL(chip_allow_sleep);
 
-static inline void chip_wakeup(struct wilc *wilc)
+void chip_wakeup(struct wilc *wilc)
 {
u32 reg, clk_status_reg, trials = 0;
 
@@ -584,6 +583,7 @@ static inline void chip_wakeup(struct wilc *wilc)
}
chip_ps_state = CHIP_WAKEDUP;
 }
+EXPORT_SYMBOL_GPL(chip_wakeup);
 
 void wilc_chip_sleep_manually(struct wi

[PATCH V2 06/26] staging: wilc1000: add ops resuem/suspend/wakeup in cfg80211

2016-01-24 Thread Glen Lee
This patch adds ops resume, suspend and set_wakeup in cfg80211. Together with
previous patches, driver will support suspend/resume functionality.

Signed-off-by: Glen Lee 
---
Changes in V2:
 - fix checkpatch ERROR: space required before the open parenthesis
---
 drivers/staging/wilc1000/wilc_wfi_cfgoperations.c | 39 +++
 1 file changed, 39 insertions(+)

diff --git a/drivers/staging/wilc1000/wilc_wfi_cfgoperations.c 
b/drivers/staging/wilc1000/wilc_wfi_cfgoperations.c
index 53fb2d4..5c23462 100644
--- a/drivers/staging/wilc1000/wilc_wfi_cfgoperations.c
+++ b/drivers/staging/wilc1000/wilc_wfi_cfgoperations.c
@@ -74,6 +74,10 @@ static const struct ieee80211_txrx_stypes
}
 };
 
+static const struct wiphy_wowlan_support wowlan_support = {
+   .flags = WIPHY_WOWLAN_ANY
+};
+
 #define WILC_WFI_DWELL_PASSIVE 100
 #define WILC_WFI_DWELL_ACTIVE  40
 
@@ -2673,6 +2677,36 @@ static int del_virtual_intf(struct wiphy *wiphy, struct 
wireless_dev *wdev)
return 0;
 }
 
+static int wilc_suspend(struct wiphy *wiphy, struct cfg80211_wowlan *wow)
+{
+   struct wilc_priv *priv = wiphy_priv(wiphy);
+   struct wilc_vif *vif = netdev_priv(priv->dev);
+
+   if (!wow && wilc_wlan_get_num_conn_ifcs(vif->wilc))
+   vif->wilc->suspend_event = true;
+   else
+   vif->wilc->suspend_event = false;
+
+   return 0;
+}
+
+static int wilc_resume(struct wiphy *wiphy)
+{
+   struct wilc_priv *priv = wiphy_priv(wiphy);
+   struct wilc_vif *vif = netdev_priv(priv->dev);
+
+   netdev_info(vif->ndev, "cfg resume\n");
+   return 0;
+}
+
+static void wilc_set_wakeup(struct wiphy *wiphy, bool enabled)
+{
+   struct wilc_priv *priv = wiphy_priv(wiphy);
+   struct wilc_vif *vif = netdev_priv(priv->dev);
+
+   netdev_info(vif->ndev, "cfg set wake up = %d\n", enabled);
+}
+
 static struct cfg80211_ops wilc_cfg80211_ops = {
.set_monitor_channel = set_channel,
.scan = scan,
@@ -2708,6 +2742,10 @@ static struct cfg80211_ops wilc_cfg80211_ops = {
.set_power_mgmt = set_power_mgmt,
.set_cqm_rssi_config = set_cqm_rssi_config,
 
+   .suspend = wilc_suspend,
+   .resume = wilc_resume,
+   .set_wakeup = wilc_set_wakeup,
+
 };
 
 int WILC_WFI_update_stats(struct wiphy *wiphy, u32 pktlen, u8 changed)
@@ -2792,6 +2830,7 @@ struct wireless_dev *wilc_create_wiphy(struct net_device 
*net, struct device *de
sema_init(&(priv->SemHandleUpdateStats), 1);
priv->wdev = wdev;
wdev->wiphy->max_scan_ssids = MAX_NUM_PROBED_SSID;
+   wdev->wiphy->wowlan = &wowlan_support;
wdev->wiphy->max_num_pmkids = WILC_MAX_NUM_PMKIDS;
PRINT_INFO(CFG80211_DBG, "Max number of PMKIDs = %d\n", 
wdev->wiphy->max_num_pmkids);
 
-- 
1.9.1

--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH V2 07/26] staging: wilc1000: remove sleep and reduce close timeout

2016-01-24 Thread Glen Lee
sleep is not necessary during handling tx queue so remove it and also reduce
close time to 5 sec since it is enough time to close.

Signed-off-by: Glen Lee 
---
 drivers/staging/wilc1000/linux_wlan.c | 5 +
 1 file changed, 1 insertion(+), 4 deletions(-)

diff --git a/drivers/staging/wilc1000/linux_wlan.c 
b/drivers/staging/wilc1000/linux_wlan.c
index 54fe9d7..236996f 100644
--- a/drivers/staging/wilc1000/linux_wlan.c
+++ b/drivers/staging/wilc1000/linux_wlan.c
@@ -391,9 +391,6 @@ static int linux_wlan_txq_task(void *vp)
}
 
if (ret == WILC_TX_ERR_NO_BUF) {
-   do {
-   msleep(TX_BACKOFF_WEIGHT_UNIT_MS << 
backoff_weight);
-   } while (0);
backoff_weight += TX_BACKOFF_WEIGHT_INCR_STEP;
if (backoff_weight > TX_BACKOFF_WEIGHT_MAX)
backoff_weight = TX_BACKOFF_WEIGHT_MAX;
@@ -1403,7 +1400,7 @@ void wilc_netdev_cleanup(struct wilc *wilc)
release_firmware(wilc->firmware);
 
if (wilc && (wilc->vif[0]->ndev || wilc->vif[1]->ndev)) {
-   wilc_lock_timeout(wilc, &close_exit_sync, 12 * 1000);
+   wilc_lock_timeout(wilc, &close_exit_sync, 5 * 1000);
 
for (i = 0; i < NUM_CONCURRENT_IFC; i++)
if (wilc->vif[i]->ndev)
-- 
1.9.1

--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH V2 09/26] staging: wilc1000: use unified firmware

2016-01-24 Thread Glen Lee
Use a unified firmware for all mode of operations which are station, ap and
p2p. Two firmware are introduced for 1002 and 1003 chipset.

Signed-off-by: Glen Lee 
---
Changes in V2:
 - fix checkpatch ERROR: space required before the open parenthesis
---
 drivers/staging/wilc1000/Makefile |  5 ++---
 drivers/staging/wilc1000/linux_wlan.c | 18 +-
 2 files changed, 11 insertions(+), 12 deletions(-)

diff --git a/drivers/staging/wilc1000/Makefile 
b/drivers/staging/wilc1000/Makefile
index 20a5cb9..90c3760 100644
--- a/drivers/staging/wilc1000/Makefile
+++ b/drivers/staging/wilc1000/Makefile
@@ -1,8 +1,7 @@
 obj-$(CONFIG_WILC1000) += wilc1000.o
 
-ccflags-y += -DSTA_FIRMWARE=\"atmel/wilc1000_fw.bin\" \
-   -DAP_FIRMWARE=\"atmel/wilc1000_ap_fw.bin\" \
-   -DP2P_CONCURRENCY_FIRMWARE=\"atmel/wilc1000_p2p_fw.bin\"
+ccflags-y += -DFIRMWARE_1002=\"atmel/wilc1002_firmware.bin\" \
+   -DFIRMWARE_1003=\"atmel/wilc1003_firmware.bin\"
 
 ccflags-y += -I$(src)/ -DWILC_ASIC_A0 -DWILC_DEBUGFS
 #ccflags-y += -DTCP_ACK_FILTER
diff --git a/drivers/staging/wilc1000/linux_wlan.c 
b/drivers/staging/wilc1000/linux_wlan.c
index 58837d7..006f75f7 100644
--- a/drivers/staging/wilc1000/linux_wlan.c
+++ b/drivers/staging/wilc1000/linux_wlan.c
@@ -416,21 +416,21 @@ int wilc_wlan_get_firmware(struct net_device *dev)
 {
struct wilc_vif *vif;
struct wilc *wilc;
-   int ret = 0;
+   int chip_id, ret = 0;
const struct firmware *wilc_firmware;
char *firmware;
 
vif = netdev_priv(dev);
wilc = vif->wilc;
 
-   if (vif->iftype == AP_MODE) {
-   firmware = AP_FIRMWARE;
-   } else if (vif->iftype == STATION_MODE) {
-   firmware = STA_FIRMWARE;
-   } else {
-   PRINT_D(INIT_DBG, "Get P2P_CONCURRENCY_FIRMWARE\n");
-   firmware = P2P_CONCURRENCY_FIRMWARE;
-   }
+   chip_id = wilc_get_chipid(wilc, 0);
+
+   if (chip_id < 0x1003a0)
+   firmware = FIRMWARE_1002;
+   else
+   firmware = FIRMWARE_1003;
+
+   netdev_info(dev, "loading firmware %s\n", firmware);
 
if (!vif) {
PRINT_ER("vif is NULL\n");
-- 
1.9.1

--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH V2 08/26] staging: wilc1000: get address from wilc

2016-01-24 Thread Glen Lee
Get mac address from wilc device instead of using random mac address.

Signed-off-by: Glen Lee 
---
 drivers/staging/wilc1000/linux_wlan.c | 9 -
 1 file changed, 4 insertions(+), 5 deletions(-)

diff --git a/drivers/staging/wilc1000/linux_wlan.c 
b/drivers/staging/wilc1000/linux_wlan.c
index 236996f..58837d7 100644
--- a/drivers/staging/wilc1000/linux_wlan.c
+++ b/drivers/staging/wilc1000/linux_wlan.c
@@ -511,20 +511,19 @@ static int wilc1000_firmware_download(struct net_device 
*dev)
 }
 
 static int linux_wlan_init_test_config(struct net_device *dev,
-  struct wilc *wilc)
+  struct wilc_vif *vif)
 {
unsigned char c_val[64];
unsigned char mac_add[] = {0x00, 0x80, 0xC2, 0x5E, 0xa2, 0xff};
-
+   struct wilc *wilc = vif->wilc;
struct wilc_priv *priv;
struct host_if_drv *hif_drv;
 
PRINT_D(TX_DBG, "Start configuring Firmware\n");
-   get_random_bytes(&mac_add[5], 1);
-   get_random_bytes(&mac_add[4], 1);
priv = wiphy_priv(dev->ieee80211_ptr->wiphy);
hif_drv = (struct host_if_drv *)priv->hWILCWFIDrv;
PRINT_D(INIT_DBG, "Host = %p\n", hif_drv);
+   wilc_get_mac_address(vif, mac_add);
 
PRINT_D(INIT_DBG, "MAC address is : %02x-%02x-%02x-%02x-%02x-%02x\n",
mac_add[0], mac_add[1], mac_add[2],
@@ -944,7 +943,7 @@ int wilc1000_wlan_init(struct net_device *dev, struct 
wilc_vif *vif)
Firmware_ver[size] = '\0';
PRINT_D(INIT_DBG, "* Firmware Ver = %s  ***\n", 
Firmware_ver);
}
-   ret = linux_wlan_init_test_config(dev, wl);
+   ret = linux_wlan_init_test_config(dev, vif);
 
if (ret < 0) {
PRINT_ER("Failed to configure firmware\n");
-- 
1.9.1

--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH V2 01/26] staging: wilc1000: fix bug when changing virtual interface

2016-01-24 Thread Glen Lee
This patch fixes a bug connection error when changing virtual interface to p2p.
Variable quit needs to be set 0 when wilc is reinitialized again.

Fixes : 67e2a07ed800 ("staging: wilc1000: move all of wilc_wlan_dev_t to struct 
wilc")
Signed-off-by: Glen Lee 
---
 drivers/staging/wilc1000/wilc_wlan.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/staging/wilc1000/wilc_wlan.c 
b/drivers/staging/wilc1000/wilc_wlan.c
index 83af51b..07460ff 100644
--- a/drivers/staging/wilc1000/wilc_wlan.c
+++ b/drivers/staging/wilc1000/wilc_wlan.c
@@ -1588,6 +1588,8 @@ int wilc_wlan_init(struct net_device *dev)
 
PRINT_D(INIT_DBG, "Initializing WILC_Wlan ...\n");
 
+   wilc->quit = 0;
+
if (!wilc->hif_func->hif_init(wilc)) {
ret = -EIO;
goto _fail_;
-- 
1.9.1

--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH V2 02/26] staging: wilc1000: remove define WILC_OPTIMIZE_SLEEP_INT

2016-01-24 Thread Glen Lee
Take the codes of WILC_OPTIMIZE_SLEEP_INT and remove codes inside ifndef.

Signed-off-by: Glen Lee 
---
 drivers/staging/wilc1000/wilc_wlan.c | 74 +---
 1 file changed, 2 insertions(+), 72 deletions(-)

diff --git a/drivers/staging/wilc1000/wilc_wlan.c 
b/drivers/staging/wilc1000/wilc_wlan.c
index 07460ff..dabb0bd 100644
--- a/drivers/staging/wilc1000/wilc_wlan.c
+++ b/drivers/staging/wilc1000/wilc_wlan.c
@@ -3,9 +3,7 @@
 #include "wilc_wfi_netdevice.h"
 #include "wilc_wlan_cfg.h"
 
-#ifdef WILC_OPTIMIZE_SLEEP_INT
 static inline void chip_allow_sleep(struct wilc *wilc);
-#endif
 static inline void chip_wakeup(struct wilc *wilc);
 static u32 dbgflag = N_INIT | N_ERR | N_INTR | N_TXQ | N_RXQ;
 
@@ -29,21 +27,14 @@ static CHIP_PS_STATE_T chip_ps_state = CHIP_WAKEDUP;
 static inline void acquire_bus(struct wilc *wilc, BUS_ACQUIRE_T acquire)
 {
mutex_lock(&wilc->hif_cs);
-   #ifndef WILC_OPTIMIZE_SLEEP_INT
-   if (chip_ps_state != CHIP_WAKEDUP)
-   #endif
-   {
-   if (acquire == ACQUIRE_AND_WAKEUP)
-   chip_wakeup(wilc);
-   }
+   if (acquire == ACQUIRE_AND_WAKEUP)
+   chip_wakeup(wilc);
 }
 
 static inline void release_bus(struct wilc *wilc, BUS_RELEASE_T release)
 {
-   #ifdef WILC_OPTIMIZE_SLEEP_INT
if (release == RELEASE_ALLOW_SLEEP)
chip_allow_sleep(wilc);
-   #endif
mutex_unlock(&wilc->hif_cs);
 }
 
@@ -524,8 +515,6 @@ static struct rxq_entry_t *wilc_wlan_rxq_remove(struct wilc 
*wilc)
return NULL;
 }
 
-#ifdef WILC_OPTIMIZE_SLEEP_INT
-
 static inline void chip_allow_sleep(struct wilc *wilc)
 {
u32 reg = 0;
@@ -538,7 +527,6 @@ static inline void chip_allow_sleep(struct wilc *wilc)
 static inline void chip_wakeup(struct wilc *wilc)
 {
u32 reg, clk_status_reg, trials = 0;
-   u32 sleep_time;
 
if ((wilc->io_type & 0x1) == HIF_SPI) {
do {
@@ -597,66 +585,14 @@ static inline void chip_wakeup(struct wilc *wilc)
}
chip_ps_state = CHIP_WAKEDUP;
 }
-#else
-static inline void chip_wakeup(struct wilc *wilc)
-{
-   u32 reg, trials = 0;
-
-   do {
-   if ((wilc->io_type & 0x1) == HIF_SPI) {
-   wilc->hif_func->hif_read_reg(wilc, 1, ®);
-   wilc->hif_func->hif_write_reg(wilc, 1, reg & ~BIT(1));
-   wilc->hif_func->hif_write_reg(wilc, 1, reg | BIT(1));
-   wilc->hif_func->hif_write_reg(wilc, 1, reg  & ~BIT(1));
-   } else if ((wilc->io_type & 0x1) == HIF_SDIO){
-   wilc->hif_func->hif_read_reg(wilc, 0xf0, ®);
-   wilc->hif_func->hif_write_reg(wilc, 0xf0,
- reg & ~BIT(0));
-   wilc->hif_func->hif_write_reg(wilc, 0xf0,
- reg | BIT(0));
-   wilc->hif_func->hif_write_reg(wilc, 0xf0,
- reg  & ~BIT(0));
-   }
-
-   do {
-   mdelay(3);
-
-   if ((wilc_get_chipid(wilc, true) == 0))
-   wilc_debug(N_ERR, "Couldn't read chip id. Wake 
up failed\n");
-
-   } while ((wilc_get_chipid(wilc, true) == 0) && ((++trials % 3) 
== 0));
-
-   } while (wilc_get_chipid(wilc, true) == 0);
 
-   if (chip_ps_state == CHIP_SLEEPING_MANUAL) {
-   wilc->hif_func->hif_read_reg(wilc, 0x1C0C, ®);
-   reg &= ~BIT(0);
-   wilc->hif_func->hif_write_reg(wilc, 0x1C0C, reg);
-
-   if (wilc_get_chipid(wilc, false) >= 0x1002b0) {
-   u32 val32;
-
-   wilc->hif_func->hif_read_reg(wilc, 0x1e1c, &val32);
-   val32 |= BIT(6);
-   wilc->hif_func->hif_write_reg(wilc, 0x1e1c, val32);
-
-   wilc->hif_func->hif_read_reg(wilc, 0x1e9c, &val32);
-   val32 |= BIT(6);
-   wilc->hif_func->hif_write_reg(wilc, 0x1e9c, val32);
-   }
-   }
-   chip_ps_state = CHIP_WAKEDUP;
-}
-#endif
 void wilc_chip_sleep_manually(struct wilc *wilc)
 {
if (chip_ps_state != CHIP_WAKEDUP)
return;
acquire_bus(wilc, ACQUIRE_ONLY);
 
-#ifdef WILC_OPTIMIZE_SLEEP_INT
chip_allow_sleep(wilc);
-#endif
wilc->hif_func->hif_write_reg(wilc, 0x10a8, 1);
 
chip_ps_state = CHIP_SLEEPING_MANUAL;
@@ -1041,9 +977,6 @@ static void wilc_pllupdate_isr_ext(struct wilc *wilc, u32 
int_stats)
 static void wilc_sleeptimer_isr_ext(struct wilc *wilc, u32 int_stats1)
 {
wilc->hif_func->hif_clear_int_ext(wilc, SLEEP_INT_CLR);
-#ifndef WILC_OPTIMIZE_SLEEP_INT
-   chip_ps_state = CHIP_SLEEPING_AUTO;
-#endif
 }
 
 static void wilc_wlan_handle_isr_ext(struct wilc *wilc, u32 int_status)
@@ 

[PATCH V2 03/26] staging: wilc1000: support suspend/resume functionality

2016-01-24 Thread Glen Lee
wilc supports suspend/resume functionality. Introduce new sleep and wakeup
functions and remove old codes since that will be handled in the new functions.

Signed-off-by: Glen Lee 
---
 drivers/staging/wilc1000/wilc_wlan.c | 31 +++
 drivers/staging/wilc1000/wilc_wlan.h |  4 +++-
 2 files changed, 22 insertions(+), 13 deletions(-)

diff --git a/drivers/staging/wilc1000/wilc_wlan.c 
b/drivers/staging/wilc1000/wilc_wlan.c
index dabb0bd..977bd8a0 100644
--- a/drivers/staging/wilc1000/wilc_wlan.c
+++ b/drivers/staging/wilc1000/wilc_wlan.c
@@ -522,6 +522,7 @@ static inline void chip_allow_sleep(struct wilc *wilc)
wilc->hif_func->hif_read_reg(wilc, 0xf0, ®);
 
wilc->hif_func->hif_write_reg(wilc, 0xf0, reg & ~BIT(0));
+   wilc->hif_func->hif_write_reg(wilc, 0xfa, 0);
 }
 
 static inline void chip_wakeup(struct wilc *wilc)
@@ -543,6 +544,8 @@ static inline void chip_wakeup(struct wilc *wilc)
 
} while (wilc_get_chipid(wilc, true) == 0);
} else if ((wilc->io_type & 0x1) == HIF_SDIO){
+   wilc->hif_func->hif_write_reg(wilc, 0xfa, 1);
+   udelay(200);
wilc->hif_func->hif_read_reg(wilc, 0xf0, ®);
do {
wilc->hif_func->hif_write_reg(wilc, 0xf0,
@@ -567,11 +570,7 @@ static inline void chip_wakeup(struct wilc *wilc)
}
 
if (chip_ps_state == CHIP_SLEEPING_MANUAL) {
-   wilc->hif_func->hif_read_reg(wilc, 0x1C0C, ®);
-   reg &= ~BIT(0);
-   wilc->hif_func->hif_write_reg(wilc, 0x1C0C, reg);
-
-   if (wilc_get_chipid(wilc, false) >= 0x1002b0) {
+   if (wilc_get_chipid(wilc, false) < 0x1002b0) {
u32 val32;
 
wilc->hif_func->hif_read_reg(wilc, 0x1e1c, &val32);
@@ -599,6 +598,20 @@ void wilc_chip_sleep_manually(struct wilc *wilc)
release_bus(wilc, RELEASE_ONLY);
 }
 
+void host_wakeup_notify(struct wilc *wilc)
+{
+   acquire_bus(wilc, ACQUIRE_ONLY);
+   wilc->hif_func->hif_write_reg(wilc, 0x10b0, 1);
+   release_bus(wilc, RELEASE_ONLY);
+}
+
+void host_sleep_notify(struct wilc *wilc)
+{
+   acquire_bus(wilc, ACQUIRE_ONLY);
+   wilc->hif_func->hif_write_reg(wilc, 0x10ac, 1);
+   release_bus(wilc, RELEASE_ONLY);
+}
+
 int wilc_wlan_handle_txq(struct net_device *dev, u32 *txq_count)
 {
int i, entries = 0;
@@ -701,9 +714,6 @@ int wilc_wlan_handle_txq(struct net_device *dev, u32 
*txq_count)
break;
}
PRINT_WRN(GENERIC_DBG, "[wilc txq]: warn, vmm 
table not clear yet, wait...\n");
-   release_bus(wilc, RELEASE_ALLOW_SLEEP);
-   usleep_range(3000, 3000);
-   acquire_bus(wilc, ACQUIRE_AND_WAKEUP);
}
} while (!wilc->quit);
 
@@ -736,9 +746,6 @@ int wilc_wlan_handle_txq(struct net_device *dev, u32 
*txq_count)
break;
} else {
release_bus(wilc, RELEASE_ALLOW_SLEEP);
-   usleep_range(3000, 3000);
-   acquire_bus(wilc, ACQUIRE_AND_WAKEUP);
-   PRINT_WRN(GENERIC_DBG, "Can't get VMM 
entery - reg = %2x\n", reg);
}
} while (--timeout);
if (timeout <= 0) {
@@ -1156,7 +1163,7 @@ int wilc_wlan_start(struct wilc *wilc)
 #ifdef WILC_EXT_PA_INV_TX_RX
reg |= WILC_HAVE_EXT_PA_INV_TX_RX;
 #endif
-
+   reg |= WILC_HAVE_USE_IRQ_AS_HOST_WAKE;
reg |= WILC_HAVE_LEGACY_RF_SETTINGS;
 #ifdef XTAL_24
reg |= WILC_HAVE_XTAL_24;
diff --git a/drivers/staging/wilc1000/wilc_wlan.h 
b/drivers/staging/wilc1000/wilc_wlan.h
index 2edd744..dd5abc5 100644
--- a/drivers/staging/wilc1000/wilc_wlan.h
+++ b/drivers/staging/wilc1000/wilc_wlan.h
@@ -106,6 +106,7 @@
 #define WILC_HAVE_LEGACY_RF_SETTINGS   BIT(5)
 #define WILC_HAVE_XTAL_24  BIT(6)
 #define WILC_HAVE_DISABLE_WILC_UARTBIT(7)
+#define WILC_HAVE_USE_IRQ_AS_HOST_WAKE BIT(8)
 
 /
  *
@@ -294,7 +295,8 @@ int wilc_mac_close(struct net_device *ndev);
 
 int wilc_wlan_set_bssid(struct net_device *wilc_netdev, u8 *pBSSID);
 void WILC_WFI_p2p_rx(struct net_device *dev, u8 *buff, u32 size);
-
+void host_wakeup_notify(struct wilc *wilc);
+void host_sleep_notify(struct wilc *wilc);
 extern bool wilc_enable_ps;
 
 #endif
-- 
1.9.1

--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH V2 00/26] use unified firmware and add ops in cfg

2016-01-24 Thread Glen Lee
This patch series contains  
* support suspend and resume functionality  
* use a unified firmware for all mode of operations(station, ap, p2p)   
* support Station/AP concurrency
* increase link speed   
* add a cfg operation for adjusting the tx power
* fix bug on p2p, WEP security and chaning virtual interface

Changes in V2: details in each patch files.
 - 0004-staging-wilc1000-add-sdio-resume-suspend.patch
 - 0006-staging-wilc1000-add-ops-resuem-suspend-wakeup-in-cf.patch
 - 0009-staging-wilc1000-use-unified-firmware.patch
 - 0015-staging-wilc1000-wilc_set_wfi_drv_handler-add-mac-in.patch
 - 0021-staging-wilc1000-increase-link-speed.patch
 - 0024-staging-wilc1000-add-ops-tx-power-in-cfg80211.patch

Glen Lee (26):
  staging: wilc1000: fix bug when changing virtual interface
  staging: wilc1000: remove define WILC_OPTIMIZE_SLEEP_INT
  staging: wilc1000: support suspend/resume functionality
  staging: wilc1000: add sdio resume/suspend
  staging: wilc1000: sdio_init: add resume argument
  staging: wilc1000: add ops resuem/suspend/wakeup in cfg80211
  staging: wilc1000: remove sleep and reduce close timeout
  staging: wilc1000: get address from wilc
  staging: wilc1000: use unified firmware
  staging: wilc1000: remove wilc_set_machw_change_vir_if
  staging: wilc1000: set bssid with mode
  staging: wilc1000: set proper bssid address
  staging: wilc1000: change_virtual_intf: change codes for unified
firmware
  staging: wilc1000: call power save after changing mode
  staging: wilc1000: wilc_set_wfi_drv_handler: add mac index
  staging: wilc1000: remove unused functions
  staging: wilc1000: ignore power save
  staging: wilc1000: handle connecting error
  staging: wilc1000: tcp_process: fix a build warning
  staging: wilc1000: remove define TCP_ACK_FILTER
  staging: wilc1000: increase link speed
  staging: wilc1000: disable power save when AP mode
  staging: wilc1000: fix bug on p2p connection
  staging: wilc1000: add ops tx power in cfg80211
  staging: wilc1000: fix WEP security bug
  staging: wilc1000: get mac address after setting drv handler

 drivers/staging/wilc1000/Makefile |   6 +-
 drivers/staging/wilc1000/host_interface.c | 250 
 drivers/staging/wilc1000/host_interface.h |   9 +-
 drivers/staging/wilc1000/linux_wlan.c |  87 +++---
 drivers/staging/wilc1000/wilc_sdio.c  | 102 ++-
 drivers/staging/wilc1000/wilc_spi.c   |   2 +-
 drivers/staging/wilc1000/wilc_wfi_cfgoperations.c | 348 +++---
 drivers/staging/wilc1000/wilc_wfi_netdevice.h |   8 +-
 drivers/staging/wilc1000/wilc_wlan.c  | 202 -
 drivers/staging/wilc1000/wilc_wlan.h  |  10 +-
 drivers/staging/wilc1000/wilc_wlan_if.h   |   3 +-
 11 files changed, 437 insertions(+), 590 deletions(-)

-- 
1.9.1

--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 15/26] Bluetooth: Use skcipher and hash

2016-01-24 Thread Marcel Holtmann
Hi Herbert,

> This patch replaces uses of blkcipher with skcipher and the long
> obsolete hash interface with shash.
> 
> Signed-off-by: Herbert Xu 

Acked-by: Marcel Holtmann 

> ---
> 
> net/bluetooth/smp.c |  135 
> 
> 1 file changed, 63 insertions(+), 72 deletions(-)

Regards

Marcel

--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 19/26] ipsec: Use skcipher and ahash when probing algorithms

2016-01-24 Thread David Miller
From: Herbert Xu 
Date: Sun, 24 Jan 2016 21:19:11 +0800

> This patch removes the last reference to hash and ablkcipher from
> IPsec and replaces them with ahash and skcipher respectively.  For
> skcipher there is currently no difference at all, while for ahash
> the current code is actually buggy and would prevent asynchronous
> algorithms from being discovered.
> 
> Signed-off-by: Herbert Xu 

Acked-by: David S. Miller 
--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 25/26] sctp: Use shash

2016-01-24 Thread David Miller
From: Herbert Xu 
Date: Sun, 24 Jan 2016 21:20:12 +0800

> This patch replaces uses of the long obsolete hash interface with
> shash.
> 
> Signed-off-by: Herbert Xu 

Acked-by: David S. Miller 
--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 26/26] tcp: Use ahash

2016-01-24 Thread David Miller
From: Herbert Xu 
Date: Sun, 24 Jan 2016 21:20:23 +0800

> This patch replaces uses of the long obsolete hash interface with
> ahash.
> 
> Signed-off-by: Herbert Xu 

Acked-by: David S. Miller 
--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[v2 PATCH 9/26] eCryptfs: Use skcipher and shash

2016-01-24 Thread Herbert Xu
On Sun, Jan 24, 2016 at 07:10:50PM +0100, Julia Lawall wrote:
> Maybe the goto on line 1726 needs a preceding mutex_unlock?

Good catch! Thanks.

---8<---
This patch replaces uses of ablkcipher and blkcipher with skcipher,
and the long obsolete hash interface with shash.

Signed-off-by: Herbert Xu 

diff --git a/fs/ecryptfs/crypto.c b/fs/ecryptfs/crypto.c
index 80d6901..11255cb 100644
--- a/fs/ecryptfs/crypto.c
+++ b/fs/ecryptfs/crypto.c
@@ -23,6 +23,8 @@
  * 02111-1307, USA.
  */
 
+#include 
+#include 
 #include 
 #include 
 #include 
@@ -30,7 +32,6 @@
 #include 
 #include 
 #include 
-#include 
 #include 
 #include 
 #include 
@@ -74,6 +75,19 @@ void ecryptfs_from_hex(char *dst, char *src, int dst_size)
}
 }
 
+static int ecryptfs_hash_digest(struct crypto_shash *tfm,
+   char *src, int len, char *dst)
+{
+   SHASH_DESC_ON_STACK(desc, tfm);
+   int err;
+
+   desc->tfm = tfm;
+   desc->flags = CRYPTO_TFM_REQ_MAY_SLEEP;
+   err = crypto_shash_digest(desc, src, len, dst);
+   shash_desc_zero(desc);
+   return err;
+}
+
 /**
  * ecryptfs_calculate_md5 - calculates the md5 of @src
  * @dst: Pointer to 16 bytes of allocated memory
@@ -88,45 +102,26 @@ static int ecryptfs_calculate_md5(char *dst,
  struct ecryptfs_crypt_stat *crypt_stat,
  char *src, int len)
 {
-   struct scatterlist sg;
-   struct hash_desc desc = {
-   .tfm = crypt_stat->hash_tfm,
-   .flags = CRYPTO_TFM_REQ_MAY_SLEEP
-   };
+   struct crypto_shash *tfm;
int rc = 0;
 
mutex_lock(&crypt_stat->cs_hash_tfm_mutex);
-   sg_init_one(&sg, (u8 *)src, len);
-   if (!desc.tfm) {
-   desc.tfm = crypto_alloc_hash(ECRYPTFS_DEFAULT_HASH, 0,
-CRYPTO_ALG_ASYNC);
-   if (IS_ERR(desc.tfm)) {
-   rc = PTR_ERR(desc.tfm);
+   tfm = crypt_stat->hash_tfm;
+   if (!tfm) {
+   tfm = crypto_alloc_shash(ECRYPTFS_DEFAULT_HASH, 0, 0);
+   if (IS_ERR(tfm)) {
+   rc = PTR_ERR(tfm);
ecryptfs_printk(KERN_ERR, "Error attempting to "
"allocate crypto context; rc = [%d]\n",
rc);
goto out;
}
-   crypt_stat->hash_tfm = desc.tfm;
-   }
-   rc = crypto_hash_init(&desc);
-   if (rc) {
-   printk(KERN_ERR
-  "%s: Error initializing crypto hash; rc = [%d]\n",
-  __func__, rc);
-   goto out;
+   crypt_stat->hash_tfm = tfm;
}
-   rc = crypto_hash_update(&desc, &sg, len);
+   rc = ecryptfs_hash_digest(tfm, src, len, dst);
if (rc) {
printk(KERN_ERR
-  "%s: Error updating crypto hash; rc = [%d]\n",
-  __func__, rc);
-   goto out;
-   }
-   rc = crypto_hash_final(&desc, dst);
-   if (rc) {
-   printk(KERN_ERR
-  "%s: Error finalizing crypto hash; rc = [%d]\n",
+  "%s: Error computing crypto hash; rc = [%d]\n",
   __func__, rc);
goto out;
}
@@ -234,10 +229,8 @@ void ecryptfs_destroy_crypt_stat(struct 
ecryptfs_crypt_stat *crypt_stat)
 {
struct ecryptfs_key_sig *key_sig, *key_sig_tmp;
 
-   if (crypt_stat->tfm)
-   crypto_free_ablkcipher(crypt_stat->tfm);
-   if (crypt_stat->hash_tfm)
-   crypto_free_hash(crypt_stat->hash_tfm);
+   crypto_free_skcipher(crypt_stat->tfm);
+   crypto_free_shash(crypt_stat->hash_tfm);
list_for_each_entry_safe(key_sig, key_sig_tmp,
 &crypt_stat->keysig_list, crypt_stat_list) {
list_del(&key_sig->crypt_stat_list);
@@ -342,7 +335,7 @@ static int crypt_scatterlist(struct ecryptfs_crypt_stat 
*crypt_stat,
 struct scatterlist *src_sg, int size,
 unsigned char *iv, int op)
 {
-   struct ablkcipher_request *req = NULL;
+   struct skcipher_request *req = NULL;
struct extent_crypt_result ecr;
int rc = 0;
 
@@ -358,20 +351,20 @@ static int crypt_scatterlist(struct ecryptfs_crypt_stat 
*crypt_stat,
init_completion(&ecr.completion);
 
mutex_lock(&crypt_stat->cs_tfm_mutex);
-   req = ablkcipher_request_alloc(crypt_stat->tfm, GFP_NOFS);
+   req = skcipher_request_alloc(crypt_stat->tfm, GFP_NOFS);
if (!req) {
mutex_unlock(&crypt_stat->cs_tfm_mutex);
rc = -ENOMEM;
goto out;
}
 
-   ablkcipher_request_set_callback(req,
+   skcipher_request_set_callback(req,
CRYPTO_TFM_REQ_MAY_BACKLOG | CRYPTO_TFM_REQ_MAY_SLEEP,
   

Re: [PATCH] iwldvm: fix chain gain calibration when firmware return zero values

2016-01-24 Thread Julian Calaby
Hi Nikolay,

A couple of minor points:

On Sat, Jan 23, 2016 at 4:35 PM, Nikolay Martynov  wrote:
> From: Nikolay Martynov <(none)>

You really need an email address here instead of "(none)" as this will
be used for the author field of the eventual commit. Check the "user"
section of your git configuration. (Try git config --list)

> It looks like sometimes firmware returns zero for chain noise and signal
> during calibration period. This seems to be a known problem and current
> implementation accounts for this by ignoring invalid data when all chains
> return zero signal and noise.
>
> The problem is that sometimes firmware returns zero for only one chain for
> some (not all) beacons used for calibration. This leads to perfectly valid
> chains be disabled and may cause invalid gain settings.
> For example this is calibration data taken on laptop with Intel 6300 card
> with all three antennas attached:
>
> active_chains:   3
> chain_noise_a:   312
> chain_noise_b:   297
> chain_noise_c:   0
> chain_signal_a:  549
> chain_signal_b:  513
> chain_signal_c:  0
> beacon_count:16
> disconn_array:   0 0 1
> delta_gain_code: 4 0 0
> radio_write: 1
> state:   3
>
> This patch changes statistics gathering to make sure that zero noise
> results are ignored for valid rx chains. The rationale being that even if
> anntenna is not connected we should be able to see non zero noise if rx
> chain is present.
>
> This patch fixes the problem of disabling working chains on hardware I
> have (6300 and 5300). It also works fine in case one 3-chain hardware has
> only two antennas attached.
>
> Signed-off-by: Nikolay Martynov 
> ---
>  drivers/net/wireless/iwlwifi/dvm/calib.c | 12 
>  1 file changed, 12 insertions(+)
>
> diff --git a/drivers/net/wireless/iwlwifi/dvm/calib.c 
> b/drivers/net/wireless/iwlwifi/dvm/calib.c
> index 20e6aa9..59e73e2 100644
> --- a/drivers/net/wireless/iwlwifi/dvm/calib.c
> +++ b/drivers/net/wireless/iwlwifi/dvm/calib.c
> @@ -1026,6 +1026,18 @@ void iwl_chain_noise_calibration(struct iwl_priv *priv)
>
> spin_unlock_bh(&priv->statistics.lock);
>
> +   /* Sometimes firmware returns zero for chain noise and signal
> +* even if chain is present and antenna is connected. This
> +* often results in perfectly valid chains being disabled.
> +* Ignore statistics if it contains zero noise for valid rx
> +* chain: even with antenna disconnected we should hear some noise.
> +*/
> +   if (((priv->nvm_data->valid_rx_ant & (1 << 0)) && chain_noise_a == 0) 
> ||
> +   ((priv->nvm_data->valid_rx_ant & (2 << 0)) && chain_noise_b == 0) 
> ||
> +   ((priv->nvm_data->valid_rx_ant & (3 << 0)) && chain_noise_c == 
> 0)) {

To expand on Emmanuel's comment, 3 << 0 is equivalent to 3. If you're
trying to set specific bits then you need to use the BIT() macro,
otherwise just get rid of the "<< 0"s.

Thanks,

-- 
Julian Calaby

Email: julian.cal...@gmail.com
Profile: http://www.google.com/profiles/julian.calaby/
--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 04/26] staging: wilc1000: add sdio resume/suspend

2016-01-24 Thread Greg KH
On Fri, Jan 22, 2016 at 05:10:39PM +0900, glen lee wrote:
> 
> On 2016년 01월 22일 16:44, Dan Carpenter wrote:
> >You should be running checkpatch.pl on your patches.
> 
> It's my mistake. I will run checkpatch.pl on the patch series.
> Thank you your advise.

Please do so and resend this series, I've dropped it from my queue.

greg k-h
--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH] iwlwifi: dvm: handle zero brightness for wifi LED

2016-01-24 Thread Emmanuel Grumbach
On Sun, Jan 24, 2016 at 2:35 PM, Hubert Tarasiuk
 wrote:
> This fixes bug 110551 with regard to sysfs.
>
> Misleading behaviour when 'led_mode=3' is passed to iwlwifi is still
> to be fixed (either by changing the option description or by making
> the LED permanently dark in such case).
>
> Signed-off-by: Hubert Tarasiuk 
> ---
>  drivers/net/wireless/iwlwifi/dvm/led.c | 5 -
>  1 file changed, 4 insertions(+), 1 deletion(-)

I picked it up and will push it out soon.
--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH] iwldvm: fix chain gain calibration when firmware return zero values

2016-01-24 Thread Emmanuel Grumbach
Hi,

Note that Wey-Yi has stepped down from maintaining iwlwifi for a while now.

On Sat, Jan 23, 2016 at 7:35 AM, Nikolay Martynov  wrote:
> From: Nikolay Martynov <(none)>
>
> It looks like sometimes firmware returns zero for chain noise and signal
> during calibration period. This seems to be a known problem and current
> implementation accounts for this by ignoring invalid data when all chains
> return zero signal and noise.
>
> The problem is that sometimes firmware returns zero for only one chain for
> some (not all) beacons used for calibration. This leads to perfectly valid
> chains be disabled and may cause invalid gain settings.
> For example this is calibration data taken on laptop with Intel 6300 card
> with all three antennas attached:
>
> active_chains:   3
> chain_noise_a:   312
> chain_noise_b:   297
> chain_noise_c:   0
> chain_signal_a:  549
> chain_signal_b:  513
> chain_signal_c:  0
> beacon_count:16
> disconn_array:   0 0 1
> delta_gain_code: 4 0 0
> radio_write: 1
> state:   3
>
> This patch changes statistics gathering to make sure that zero noise
> results are ignored for valid rx chains. The rationale being that even if
> anntenna is not connected we should be able to see non zero noise if rx
> chain is present.
>
> This patch fixes the problem of disabling working chains on hardware I
> have (6300 and 5300). It also works fine in case one 3-chain hardware has
> only two antennas attached.

So how will that work if an antenna is disconnected? You always seem
to ignore the sampling that returned 0.

>
> Signed-off-by: Nikolay Martynov 
> ---
>  drivers/net/wireless/iwlwifi/dvm/calib.c | 12 
>  1 file changed, 12 insertions(+)
>
> diff --git a/drivers/net/wireless/iwlwifi/dvm/calib.c 
> b/drivers/net/wireless/iwlwifi/dvm/calib.c
> index 20e6aa9..59e73e2 100644
> --- a/drivers/net/wireless/iwlwifi/dvm/calib.c
> +++ b/drivers/net/wireless/iwlwifi/dvm/calib.c
> @@ -1026,6 +1026,18 @@ void iwl_chain_noise_calibration(struct iwl_priv *priv)
>
> spin_unlock_bh(&priv->statistics.lock);
>
> +   /* Sometimes firmware returns zero for chain noise and signal
> +* even if chain is present and antenna is connected. This
> +* often results in perfectly valid chains being disabled.
> +* Ignore statistics if it contains zero noise for valid rx
> +* chain: even with antenna disconnected we should hear some noise.
> +*/
> +   if (((priv->nvm_data->valid_rx_ant & (1 << 0)) && chain_noise_a == 0) 
> ||
> +   ((priv->nvm_data->valid_rx_ant & (2 << 0)) && chain_noise_b == 0) 
> ||
> +   ((priv->nvm_data->valid_rx_ant & (3 << 0)) && chain_noise_c == 
> 0)) {
> +   return;
> +   }

I guess this is a typo, you wanted BIT(1), BIT(2) and BIT(3), right?

> +
> data->beacon_count++;
>
> data->chain_noise_a = (chain_noise_a + data->chain_noise_a);
> --
> 2.7.0
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
> the body of a message to majord...@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 3/26] staging: rtl8192e: Replace uses of obsolete blkcipher and hash

2016-01-24 Thread Greg KH
On Sun, Jan 24, 2016 at 09:16:26PM +0800, Herbert Xu wrote:
> The interfaces blkcipher and hash are obsolete.  This patch replaces
> them with skcipher and ahash respectively.
> 
> Signed-off-by: Herbert Xu 
> ---
> 
>  drivers/staging/rtl8192e/rtllib_crypt_tkip.c |   99 
> ++-
>  drivers/staging/rtl8192e/rtllib_crypt_wep.c  |   48 +++--
>  2 files changed, 82 insertions(+), 65 deletions(-)

Acked-by: Greg Kroah-Hartman 
--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 6/26] staging: rtl8192u: Use skcipher and ahash

2016-01-24 Thread Greg KH
On Sun, Jan 24, 2016 at 09:16:57PM +0800, Herbert Xu wrote:
> This patch replaces uses of blkcipher with skcipher, and the long
> obsolete hash interface with ahash.
> 
> Signed-off-by: Herbert Xu 
> ---
> 
>  drivers/staging/rtl8192u/ieee80211/ieee80211_crypt_tkip.c |   92 
> +++---
>  drivers/staging/rtl8192u/ieee80211/ieee80211_crypt_wep.c  |   46 ---
>  2 files changed, 81 insertions(+), 57 deletions(-)

Acked-by: Greg Kroah-Hartman 
--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 9/26] eCryptfs: Use skcipher and shash

2016-01-24 Thread Julia Lawall
Maybe the goto on line 1726 needs a preceding mutex_unlock?

julia

On Mon, 25 Jan 2016, kbuild test robot wrote:

> Hi Herbert,
>
> [auto build test WARNING on net/master]
> [also build test WARNING on v4.4 next-20160122]
> [if your patch is applied to the wrong git tree, please drop us a note to 
> help improving the system]
>
> url:
> https://github.com/0day-ci/linux/commits/Herbert-Xu/crypto-Use-skcipher-and-ahash-shash-where-possible/20160124-212323
> :: branch date: 5 hours ago
> :: commit date: 5 hours ago
>
> >> fs/ecryptfs/keystore.c:1761:1-7: preceding lock on line 1719
>
> git remote add linux-review https://github.com/0day-ci/linux
> git remote update linux-review
> git checkout 0186bf144c1f96606f491be0e7ed47b79ea0d285
> vim +1761 fs/ecryptfs/keystore.c
>
> ac97b9f9 Michael Halcrow 2008-11-19  1713 if (rc < 1 || rc > 2) {
> f4aad16a Michael Halcrow 2007-10-16  1714 printk(KERN_ERR 
> "Internal error whilst attempting to convert "
> f4aad16a Michael Halcrow 2007-10-16  1715 
> "auth_tok->session_key.decrypted_key to scatterlist; "
> f4aad16a Michael Halcrow 2007-10-16  1716 "expected rc = 
> 1; got rc = [%d]\n", rc);
> f4aad16a Michael Halcrow 2007-10-16  1717 goto out;
> 237fead6 Michael Halcrow 2006-10-04  1718 }
> 237fead6 Michael Halcrow 2006-10-04 @1719 mutex_lock(tfm_mutex);
> 0186bf14 Herbert Xu  2016-01-24  1720 req = 
> skcipher_request_alloc(tfm, GFP_KERNEL);
> 0186bf14 Herbert Xu  2016-01-24  1721 if (!req) {
> 0186bf14 Herbert Xu  2016-01-24  1722 printk(KERN_ERR "%s: 
> Out of kernel memory whilst attempting to "
> 0186bf14 Herbert Xu  2016-01-24  1723
> "skcipher_request_alloc for %s\n", __func__,
> 0186bf14 Herbert Xu  2016-01-24  1724
> crypto_skcipher_driver_name(tfm));
> 0186bf14 Herbert Xu  2016-01-24  1725 rc = -ENOMEM;
> 0186bf14 Herbert Xu  2016-01-24  1726 goto out;
> 0186bf14 Herbert Xu  2016-01-24  1727 }
> 0186bf14 Herbert Xu  2016-01-24  1728
> 0186bf14 Herbert Xu  2016-01-24  1729 
> skcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_SLEEP,
> 0186bf14 Herbert Xu  2016-01-24  1730   
> NULL, NULL);
> 0186bf14 Herbert Xu  2016-01-24  1731 rc = crypto_skcipher_setkey(
> 0186bf14 Herbert Xu  2016-01-24  1732 tfm, 
> auth_tok->token.password.session_key_encryption_key,
> 237fead6 Michael Halcrow 2006-10-04  1733 crypt_stat->key_size);
> f4aad16a Michael Halcrow 2007-10-16  1734 if (unlikely(rc < 0)) {
> f4aad16a Michael Halcrow 2007-10-16  1735 mutex_unlock(tfm_mutex);
> e5d9cbde Michael Halcrow 2006-10-30  1736 printk(KERN_ERR "Error 
> setting key for crypto context\n");
> e5d9cbde Michael Halcrow 2006-10-30  1737 rc = -EINVAL;
> f4aad16a Michael Halcrow 2007-10-16  1738 goto out;
> 237fead6 Michael Halcrow 2006-10-04  1739 }
> 0186bf14 Herbert Xu  2016-01-24  1740 skcipher_request_set_crypt(req, 
> src_sg, dst_sg,
> 0186bf14 Herbert Xu  2016-01-24  1741
> auth_tok->session_key.encrypted_key_size,
> 0186bf14 Herbert Xu  2016-01-24  1742
> NULL);
> 0186bf14 Herbert Xu  2016-01-24  1743 rc = 
> crypto_skcipher_decrypt(req);
> f4aad16a Michael Halcrow 2007-10-16  1744 mutex_unlock(tfm_mutex);
> f4aad16a Michael Halcrow 2007-10-16  1745 if (unlikely(rc)) {
> 8bba066f Michael Halcrow 2006-10-30  1746 printk(KERN_ERR "Error 
> decrypting; rc = [%d]\n", rc);
> f4aad16a Michael Halcrow 2007-10-16  1747 goto out;
> 8bba066f Michael Halcrow 2006-10-30  1748 }
> 237fead6 Michael Halcrow 2006-10-04  1749 auth_tok->session_key.flags |= 
> ECRYPTFS_CONTAINS_DECRYPTED_KEY;
> 237fead6 Michael Halcrow 2006-10-04  1750 memcpy(crypt_stat->key, 
> auth_tok->session_key.decrypted_key,
> 237fead6 Michael Halcrow 2006-10-04  1751
> auth_tok->session_key.decrypted_key_size);
> e2bd99ec Michael Halcrow 2007-02-12  1752 crypt_stat->flags |= 
> ECRYPTFS_KEY_VALID;
> f4aad16a Michael Halcrow 2007-10-16  1753 if (unlikely(ecryptfs_verbosity 
> > 0)) {
> f24b3887 Tyler Hicks 2010-11-15  1754 
> ecryptfs_printk(KERN_DEBUG, "FEK of size [%zd]:\n",
> f4aad16a Michael Halcrow 2007-10-16  1755 
> crypt_stat->key_size);
> 237fead6 Michael Halcrow 2006-10-04  1756 
> ecryptf

Re: [PATCH 2/2] mac80211: let unused MPP table entries timeout

2016-01-24 Thread Henning Rogge
On Sat, Jan 23, 2016 at 4:15 PM, Bob Copeland  wrote:
> On Sat, Jan 23, 2016 at 10:39:04AM +0100, Henning Rogge wrote:
>> > FYI I have a patch set I'm testing which rewrites a big chunk of
>> > the path table stuff.
>>
>> Does it include some cleanup paths for the MPP table? At the moment
>> the "missing cleanup" still allows remote users to make the Linux
>> kernel to allocate as much memory as it wants... with no way to free
>> it except for shutting down the interface.
>
> No, it needs these patches too.  I did harmonize them a little bit,
> so that e.g. the expiry check will be done during lookup, but I didn't
> add an equivalent to flush-by-proxy.
>
> One issue it does address is that the path table can eventually shrink
> by virtue of the rhashtable, whereas now the bucket size is
> ever-growing.
>
>> > Let me know if you want me to base on top.
>>
>> I would like them to go in first... my experience of the kernel code
>> (outside some parts of the wifi stack) is not that good, so I don't
>> know how long I would need to adapt the patches to your new data
>> structures.
>
> Ok, sounds good, I'll just rebase on top of yours.

Thank you...

if you have problem with the "remove by proxy" patch I could look over
the patches you made... this part was quite trivial to do on the old
code and it should be easy for the new one too (as long as there is a
"remove MPath" and a "remove MPP" function).

Henning
--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH] bcma: add support for BCM47094

2016-01-24 Thread Rafał Miłecki
It's another SoC with 32 GPIOs and simplified watchdog handling. It was
tested on D-Link DIR-885L.

Signed-off-by: Rafał Miłecki 
---
 drivers/bcma/driver_chipcommon.c | 1 +
 drivers/bcma/driver_gpio.c   | 1 +
 include/linux/bcma/bcma.h| 1 +
 3 files changed, 3 insertions(+)

diff --git a/drivers/bcma/driver_chipcommon.c b/drivers/bcma/driver_chipcommon.c
index bdb73d9..b0f44a2 100644
--- a/drivers/bcma/driver_chipcommon.c
+++ b/drivers/bcma/driver_chipcommon.c
@@ -197,6 +197,7 @@ u32 bcma_chipco_watchdog_timer_set(struct bcma_drv_cc *cc, 
u32 ticks)
struct bcma_bus *bus = cc->core->bus;
 
if (bus->chipinfo.id != BCMA_CHIP_ID_BCM4707 &&
+   bus->chipinfo.id != BCMA_CHIP_ID_BCM47094 &&
bus->chipinfo.id != BCMA_CHIP_ID_BCM53018)
bcma_core_set_clockmode(cc->core,
ticks ? BCMA_CLKMODE_FAST : 
BCMA_CLKMODE_DYNAMIC);
diff --git a/drivers/bcma/driver_gpio.c b/drivers/bcma/driver_gpio.c
index 504899a7..77b0738f 100644
--- a/drivers/bcma/driver_gpio.c
+++ b/drivers/bcma/driver_gpio.c
@@ -197,6 +197,7 @@ int bcma_gpio_init(struct bcma_drv_cc *cc)
case BCMA_CHIP_ID_BCM4707:
case BCMA_CHIP_ID_BCM5357:
case BCMA_CHIP_ID_BCM53572:
+   case BCMA_CHIP_ID_BCM47094:
chip->ngpio = 32;
break;
default:
diff --git a/include/linux/bcma/bcma.h b/include/linux/bcma/bcma.h
index 991ebb4..0367c63 100644
--- a/include/linux/bcma/bcma.h
+++ b/include/linux/bcma/bcma.h
@@ -201,6 +201,7 @@ struct bcma_host_ops {
 #define  BCMA_PKG_ID_BCM4707   1
 #define  BCMA_PKG_ID_BCM4708   2
 #define  BCMA_PKG_ID_BCM4709   0
+#define BCMA_CHIP_ID_BCM47094  53030
 #define BCMA_CHIP_ID_BCM53018  53018
 
 /* Board types (on PCI usually equals to the subsystem dev id) */
-- 
1.8.4.5

--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 21/26] nfc: s3fwrn5: Use shash

2016-01-24 Thread kbuild test robot
Hi Herbert,

[auto build test ERROR on net/master]
[also build test ERROR on v4.4 next-20160122]
[if your patch is applied to the wrong git tree, please drop us a note to help 
improving the system]

url:
https://github.com/0day-ci/linux/commits/Herbert-Xu/crypto-Use-skcipher-and-ahash-shash-where-possible/20160124-212323
config: x86_64-randconfig-x014-201604 (attached as .config)
reproduce:
# save the attached .config to linux build tree
make ARCH=x86_64 

All errors (new ones prefixed by >>):

   drivers/nfc/s3fwrn5/firmware.c: In function 's3fwrn5_fw_download':
>> drivers/nfc/s3fwrn5/firmware.c:456:3: error: implicit declaration of 
>> function 'shash_desc_zero' [-Werror=implicit-function-declaration]
  shash_desc_zero(desc);
  ^
   cc1: some warnings being treated as errors

vim +/shash_desc_zero +456 drivers/nfc/s3fwrn5/firmware.c

   450  
   451  desc->tfm = tfm;
   452  desc->flags = CRYPTO_TFM_REQ_MAY_SLEEP;
   453  
   454  ret = crypto_shash_digest(desc, fw->image, image_size,
   455hash_data);
 > 456  shash_desc_zero(desc);
   457  }
   458  
   459  crypto_free_shash(tfm);

---
0-DAY kernel test infrastructureOpen Source Technology Center
https://lists.01.org/pipermail/kbuild-all   Intel Corporation


.config.gz
Description: Binary data


Re: [PATCH 24/26] nfsd: Use shash

2016-01-24 Thread kbuild test robot
Hi Herbert,

[auto build test ERROR on net/master]
[also build test ERROR on v4.4 next-20160122]
[if your patch is applied to the wrong git tree, please drop us a note to help 
improving the system]

url:
https://github.com/0day-ci/linux/commits/Herbert-Xu/crypto-Use-skcipher-and-ahash-shash-where-possible/20160124-212323
config: x86_64-randconfig-x009-201604 (attached as .config)
reproduce:
# save the attached .config to linux build tree
make ARCH=x86_64 

All errors (new ones prefixed by >>):

   fs/nfsd/nfs4recover.c: In function 'nfs4_make_rec_clidname':
>> fs/nfsd/nfs4recover.c:133:3: error: implicit declaration of function 
>> 'shash_desc_zero' [-Werror=implicit-function-declaration]
  shash_desc_zero(desc);
  ^
   cc1: some warnings being treated as errors

vim +/shash_desc_zero +133 fs/nfsd/nfs4recover.c

   127  
   128  desc->tfm = tfm;
   129  desc->flags = CRYPTO_TFM_REQ_MAY_SLEEP;
   130  
   131  status = crypto_shash_digest(desc, clname->data, 
clname->len,
   132   cksum.data);
 > 133  shash_desc_zero(desc);
   134  }
   135  
   136  if (status)

---
0-DAY kernel test infrastructureOpen Source Technology Center
https://lists.01.org/pipermail/kbuild-all   Intel Corporation


.config.gz
Description: Binary data


Re: [PATCH 19/26] ipsec: Use skcipher and ahash when probing algorithms

2016-01-24 Thread kbuild test robot
Hi Herbert,

[auto build test ERROR on net/master]
[also build test ERROR on v4.4 next-20160122]
[if your patch is applied to the wrong git tree, please drop us a note to help 
improving the system]

url:
https://github.com/0day-ci/linux/commits/Herbert-Xu/crypto-Use-skcipher-and-ahash-shash-where-possible/20160124-212323
config: x86_64-randconfig-x014-201604 (attached as .config)
reproduce:
# save the attached .config to linux build tree
make ARCH=x86_64 

All errors (new ones prefixed by >>):

   net/xfrm/xfrm_algo.c: In function 'xfrm_probe_algs':
>> net/xfrm/xfrm_algo.c:787:12: error: implicit declaration of function 
>> 'crypto_has_ahash' [-Werror=implicit-function-declaration]
  status = crypto_has_ahash(aalg_list[i].name, 0, 0);
   ^
   cc1: some warnings being treated as errors

vim +/crypto_has_ahash +787 net/xfrm/xfrm_algo.c

   781  {
   782  int i, status;
   783  
   784  BUG_ON(in_softirq());
   785  
   786  for (i = 0; i < aalg_entries(); i++) {
 > 787  status = crypto_has_ahash(aalg_list[i].name, 0, 0);
   788  if (aalg_list[i].available != status)
   789  aalg_list[i].available = status;
   790  }

---
0-DAY kernel test infrastructureOpen Source Technology Center
https://lists.01.org/pipermail/kbuild-all   Intel Corporation


.config.gz
Description: Binary data


Re: [PATCH 4/26] dm crypt: Use skcipher and ahash

2016-01-24 Thread kbuild test robot
Hi Herbert,

[auto build test ERROR on net/master]
[also build test ERROR on v4.4 next-20160122]
[if your patch is applied to the wrong git tree, please drop us a note to help 
improving the system]

url:
https://github.com/0day-ci/linux/commits/Herbert-Xu/crypto-Use-skcipher-and-ahash-shash-where-possible/20160124-212323
config: x86_64-randconfig-x014-201604 (attached as .config)
reproduce:
# save the attached .config to linux build tree
make ARCH=x86_64 

All errors (new ones prefixed by >>):

   drivers/md/dm-crypt.c: In function 'crypt_iv_essiv_init':
>> drivers/md/dm-crypt.c:278:2: error: implicit declaration of function 
>> 'ahash_request_zero' [-Werror=implicit-function-declaration]
 ahash_request_zero(req);
 ^
   cc1: some warnings being treated as errors

vim +/ahash_request_zero +278 drivers/md/dm-crypt.c

   272  sg_init_one(&sg, cc->key, cc->key_size);
   273  ahash_request_set_tfm(req, essiv->hash_tfm);
   274  ahash_request_set_callback(req, CRYPTO_TFM_REQ_MAY_SLEEP, NULL, 
NULL);
   275  ahash_request_set_crypt(req, &sg, essiv->salt, cc->key_size);
   276  
   277  err = crypto_ahash_digest(req);
 > 278  ahash_request_zero(req);
   279  if (err)
   280  return err;
   281  

---
0-DAY kernel test infrastructureOpen Source Technology Center
https://lists.01.org/pipermail/kbuild-all   Intel Corporation


.config.gz
Description: Binary data


Re: [PATCH 1/26] block: cryptoloop - Use new skcipher interface

2016-01-24 Thread Herbert Xu
On Sun, Jan 24, 2016 at 09:37:33PM +0800, kbuild test robot wrote:
> 
> [auto build test ERROR on net/master]
> [also build test ERROR on v4.4 next-20160122]
> [if your patch is applied to the wrong git tree, please drop us a note to 
> help improving the system]

These patches depend on the two helpers that I posted yesterday
so unfortunately we'll be getting quite a few build errors from
the bot.

Cheers,
-- 
Email: Herbert Xu 
Home Page: http://gondor.apana.org.au/~herbert/
PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt
--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 9/26] eCryptfs: Use skcipher and shash

2016-01-24 Thread kbuild test robot
Hi Herbert,

[auto build test ERROR on net/master]
[also build test ERROR on v4.4 next-20160122]
[if your patch is applied to the wrong git tree, please drop us a note to help 
improving the system]

url:
https://github.com/0day-ci/linux/commits/Herbert-Xu/crypto-Use-skcipher-and-ahash-shash-where-possible/20160124-212323
config: x86_64-randconfig-x012-201604 (attached as .config)
reproduce:
# save the attached .config to linux build tree
make ARCH=x86_64 

All error/warnings (new ones prefixed by >>):

   fs/ecryptfs/crypto.c: In function 'ecryptfs_hash_digest':
>> fs/ecryptfs/crypto.c:87:2: error: implicit declaration of function 
>> 'shash_desc_zero' [-Werror=implicit-function-declaration]
 shash_desc_zero(desc);
 ^
   fs/ecryptfs/crypto.c: In function 'ecryptfs_process_key_cipher':
>> fs/ecryptfs/crypto.c:1614:15: error: implicit declaration of function 
>> 'crypto_skcipher_default_keysize' [-Werror=implicit-function-declaration]
  *key_size = crypto_skcipher_default_keysize(*key_tfm);
  ^
   cc1: some warnings being treated as errors
--
   fs/ecryptfs/keystore.c: In function 'ecryptfs_write_tag_70_packet':
>> fs/ecryptfs/keystore.c:700:10: error: implicit declaration of function 
>> 'crypto_skcipher_driver_name' [-Werror=implicit-function-declaration]
 crypto_skcipher_driver_name(s->skcipher_tfm));
 ^
   In file included from include/linux/printk.h:6:0,
from include/linux/kernel.h:13,
from include/linux/crypto.h:21,
from include/crypto/hash.h:16,
from fs/ecryptfs/keystore.c:28:
>> include/linux/kern_levels.h:4:18: warning: format '%s' expects argument of 
>> type 'char *', but argument 3 has type 'int' [-Wformat=]
#define KERN_SOH "\001"  /* ASCII Start Of Header */
 ^
   include/linux/kern_levels.h:10:18: note: in expansion of macro 'KERN_SOH'
#define KERN_ERR KERN_SOH "3" /* error conditions */
 ^
>> fs/ecryptfs/keystore.c:698:10: note: in expansion of macro 'KERN_ERR'
  printk(KERN_ERR "%s: Out of kernel memory whilst attempting to "
 ^
   fs/ecryptfs/keystore.c: In function 'ecryptfs_parse_tag_70_packet':
>> include/linux/kern_levels.h:4:18: warning: format '%s' expects argument of 
>> type 'char *', but argument 3 has type 'int' [-Wformat=]
#define KERN_SOH "\001"  /* ASCII Start Of Header */
 ^
   include/linux/kern_levels.h:10:18: note: in expansion of macro 'KERN_SOH'
#define KERN_ERR KERN_SOH "3" /* error conditions */
 ^
   fs/ecryptfs/keystore.c:1031:10: note: in expansion of macro 'KERN_ERR'
  printk(KERN_ERR "%s: Out of kernel memory whilst attempting to "
 ^
   fs/ecryptfs/keystore.c: In function 
'decrypt_passphrase_encrypted_session_key':
>> include/linux/kern_levels.h:4:18: warning: format '%s' expects argument of 
>> type 'char *', but argument 3 has type 'int' [-Wformat=]
#define KERN_SOH "\001"  /* ASCII Start Of Header */
 ^
   include/linux/kern_levels.h:10:18: note: in expansion of macro 'KERN_SOH'
#define KERN_ERR KERN_SOH "3" /* error conditions */
 ^
   fs/ecryptfs/keystore.c:1722:10: note: in expansion of macro 'KERN_ERR'
  printk(KERN_ERR "%s: Out of kernel memory whilst attempting to "
 ^
   fs/ecryptfs/keystore.c: In function 'write_tag_3_packet':
>> fs/ecryptfs/keystore.c:2232:10: error: implicit declaration of function 
>> 'crypto_skcipher_default_keysize' [-Werror=implicit-function-declaration]
 crypto_skcipher_default_keysize(tfm));
 ^
   In file included from fs/ecryptfs/keystore.c:36:0:
>> include/linux/kern_levels.h:4:18: warning: format '%s' expects argument of 
>> type 'char *', but argument 3 has type 'int' [-Wformat=]
#define KERN_SOH "\001"  /* ASCII Start Of Header */
 ^
   fs/ecryptfs/ecryptfs_kernel.h:530:27: note: in definition of macro 
'ecryptfs_printk'
__ecryptfs_printk(type "%s: " fmt, __func__, ## arg);
  ^
   include/linux/kern_levels.h:10:18: note: in expansion of macro 'KERN_SOH'
#define KERN_ERR KERN_SOH "3" /* error conditions */
 ^
   fs/ecryptfs/keystore.c:2316:19: note: in expansion of macro 'KERN_ERR'
  ecryptfs_printk(KERN_ERR, "Out of kernel memory wh

Re: [PATCH 7/26] wusb: Use skcipher

2016-01-24 Thread kbuild test robot
Hi Herbert,

[auto build test ERROR on net/master]
[also build test ERROR on v4.4 next-20160122]
[if your patch is applied to the wrong git tree, please drop us a note to help 
improving the system]

url:
https://github.com/0day-ci/linux/commits/Herbert-Xu/crypto-Use-skcipher-and-ahash-shash-where-possible/20160124-212323
config: x86_64-randconfig-x016-201604 (attached as .config)
reproduce:
# save the attached .config to linux build tree
make ARCH=x86_64 

All errors (new ones prefixed by >>):

   drivers/usb/wusbcore/crypto.c: In function 'wusb_ccm_mac':
>> drivers/usb/wusbcore/crypto.c:266:2: error: implicit declaration of function 
>> 'skcipher_request_zero' [-Werror=implicit-function-declaration]
 skcipher_request_zero(req);
 ^
   cc1: some warnings being treated as errors

vim +/skcipher_request_zero +266 drivers/usb/wusbcore/crypto.c

   260  sg_init_one(&sg_dst, dst_buf, dst_size);
   261  
   262  skcipher_request_set_tfm(req, tfm_cbc);
   263  skcipher_request_set_callback(req, 0, NULL, NULL);
   264  skcipher_request_set_crypt(req, sg, &sg_dst, dst_size, iv);
   265  result = crypto_skcipher_encrypt(req);
 > 266  skcipher_request_zero(req);
   267  if (result < 0) {
   268  printk(KERN_ERR "E: can't compute CBC-MAC tag (MIC): 
%d\n",
   269 result);

---
0-DAY kernel test infrastructureOpen Source Technology Center
https://lists.01.org/pipermail/kbuild-all   Intel Corporation


.config.gz
Description: Binary data


Re: [PATCH 15/26] Bluetooth: Use skcipher and hash

2016-01-24 Thread kbuild test robot
Hi Herbert,

[auto build test ERROR on net/master]
[also build test ERROR on v4.4 next-20160122]
[if your patch is applied to the wrong git tree, please drop us a note to help 
improving the system]

url:
https://github.com/0day-ci/linux/commits/Herbert-Xu/crypto-Use-skcipher-and-ahash-shash-where-possible/20160124-212323
config: x86_64-randconfig-x014-201604 (attached as .config)
reproduce:
# save the attached .config to linux build tree
make ARCH=x86_64 

All errors (new ones prefixed by >>):

   net/bluetooth/smp.c: In function 'aes_cmac':
>> net/bluetooth/smp.c:201:2: error: implicit declaration of function 
>> 'shash_desc_zero' [-Werror=implicit-function-declaration]
 shash_desc_zero(desc);
 ^
   net/bluetooth/smp.c: In function 'smp_e':
>> net/bluetooth/smp.c:397:2: error: implicit declaration of function 
>> 'skcipher_request_zero' [-Werror=implicit-function-declaration]
 skcipher_request_zero(req);
 ^
   cc1: some warnings being treated as errors

vim +/shash_desc_zero +201 net/bluetooth/smp.c

   195  if (err) {
   196  BT_ERR("cipher setkey failed: %d", err);
   197  return err;
   198  }
   199  
   200  err = crypto_shash_digest(desc, msg_msb, len, mac_msb);
 > 201  shash_desc_zero(desc);
   202  if (err) {
   203  BT_ERR("Hash computation error %d", err);
   204  return err;
   205  }
   206  
   207  swap_buf(mac_msb, mac, 16);
   208  
   209  SMP_DBG("mac %16phN", mac);
   210  
   211  return 0;
   212  }
   213  
   214  static int smp_f4(struct crypto_shash *tfm_cmac, const u8 u[32],
   215const u8 v[32], const u8 x[16], u8 z, u8 res[16])
   216  {
   217  u8 m[65];
   218  int err;
   219  
   220  SMP_DBG("u %32phN", u);
   221  SMP_DBG("v %32phN", v);
   222  SMP_DBG("x %16phN z %02x", x, z);
   223  
   224  m[0] = z;
   225  memcpy(m + 1, v, 32);
   226  memcpy(m + 33, u, 32);
   227  
   228  err = aes_cmac(tfm_cmac, x, m, sizeof(m), res);
   229  if (err)
   230  return err;
   231  
   232  SMP_DBG("res %16phN", res);
   233  
   234  return err;
   235  }
   236  
   237  static int smp_f5(struct crypto_shash *tfm_cmac, const u8 w[32],
   238const u8 n1[16], const u8 n2[16], const u8 a1[7],
   239const u8 a2[7], u8 mackey[16], u8 ltk[16])
   240  {
   241  /* The btle, salt and length "magic" values are as defined in
   242   * the SMP section of the Bluetooth core specification. In ASCII
   243   * the btle value ends up being 'btle'. The salt is just a
   244   * random number whereas length is the value 256 in little
   245   * endian format.
   246   */
   247  const u8 btle[4] = { 0x65, 0x6c, 0x74, 0x62 };
   248  const u8 salt[16] = { 0xbe, 0x83, 0x60, 0x5a, 0xdb, 0x0b, 0x37, 
0x60,
   2490x38, 0xa5, 0xf5, 0xaa, 0x91, 0x83, 0x88, 
0x6c };
   250  const u8 length[2] = { 0x00, 0x01 };
   251  u8 m[53], t[16];
   252  int err;
   253  
   254  SMP_DBG("w %32phN", w);
   255  SMP_DBG("n1 %16phN n2 %16phN", n1, n2);
   256  SMP_DBG("a1 %7phN a2 %7phN", a1, a2);
   257  
   258  err = aes_cmac(tfm_cmac, salt, w, 32, t);
   259  if (err)
   260  return err;
   261  
   262  SMP_DBG("t %16phN", t);
   263  
   264  memcpy(m, length, 2);
   265  memcpy(m + 2, a2, 7);
   266  memcpy(m + 9, a1, 7);
   267  memcpy(m + 16, n2, 16);
   268  memcpy(m + 32, n1, 16);
   269  memcpy(m + 48, btle, 4);
   270  
   271  m[52] = 0; /* Counter */
   272  
   273  err = aes_cmac(tfm_cmac, t, m, sizeof(m), mackey);
   274  if (err)
   275  return err;
   276  
   277  SMP_DBG("mackey %16phN", mackey);
   278  
   279  m[52] = 1; /* Counter */
   280  
   281  err = aes_cmac(tfm_cmac, t, m, sizeof(m), ltk);
   282  if (err)
   283  return err;
   284  
   285  SMP_DBG("ltk %16phN", ltk);
   286  
   287  return 0;
   288  }
   289  
   290  static int smp_f6(struct crypto_shash *tfm_cmac, const u8 w[16],
   291const u8 n1[16], const u8 n2[16], const u8 r[16],
   292const u8 io_cap[3], const u8 a1[7], const u8 a2[7],
   293u8 res[16])
   294  {
   295  u8 m[65];
   296  int err;
   297  
   298  SMP_DBG("w %16phN", w)

[PATCH 5/26] orinoco: Use ahash

2016-01-24 Thread Herbert Xu
This patch replaces uses the long obsolete hash interface with ahash.

Signed-off-by: Herbert Xu 
---

 drivers/net/wireless/intersil/orinoco/mic.c |   29 ++--
 drivers/net/wireless/intersil/orinoco/mic.h |4 +--
 drivers/net/wireless/intersil/orinoco/orinoco.h |4 +--
 3 files changed, 21 insertions(+), 16 deletions(-)

diff --git a/drivers/net/wireless/intersil/orinoco/mic.c 
b/drivers/net/wireless/intersil/orinoco/mic.c
index fce4a84..bc7397d 100644
--- a/drivers/net/wireless/intersil/orinoco/mic.c
+++ b/drivers/net/wireless/intersil/orinoco/mic.c
@@ -6,7 +6,7 @@
 #include 
 #include 
 #include 
-#include 
+#include 
 
 #include "orinoco.h"
 #include "mic.h"
@@ -16,7 +16,8 @@
 //
 int orinoco_mic_init(struct orinoco_private *priv)
 {
-   priv->tx_tfm_mic = crypto_alloc_hash("michael_mic", 0, 0);
+   priv->tx_tfm_mic = crypto_alloc_ahash("michael_mic", 0,
+ CRYPTO_ALG_ASYNC);
if (IS_ERR(priv->tx_tfm_mic)) {
printk(KERN_DEBUG "orinoco_mic_init: could not allocate "
   "crypto API michael_mic\n");
@@ -24,7 +25,8 @@ int orinoco_mic_init(struct orinoco_private *priv)
return -ENOMEM;
}
 
-   priv->rx_tfm_mic = crypto_alloc_hash("michael_mic", 0, 0);
+   priv->rx_tfm_mic = crypto_alloc_ahash("michael_mic", 0,
+ CRYPTO_ALG_ASYNC);
if (IS_ERR(priv->rx_tfm_mic)) {
printk(KERN_DEBUG "orinoco_mic_init: could not allocate "
   "crypto API michael_mic\n");
@@ -38,18 +40,19 @@ int orinoco_mic_init(struct orinoco_private *priv)
 void orinoco_mic_free(struct orinoco_private *priv)
 {
if (priv->tx_tfm_mic)
-   crypto_free_hash(priv->tx_tfm_mic);
+   crypto_free_ahash(priv->tx_tfm_mic);
if (priv->rx_tfm_mic)
-   crypto_free_hash(priv->rx_tfm_mic);
+   crypto_free_ahash(priv->rx_tfm_mic);
 }
 
-int orinoco_mic(struct crypto_hash *tfm_michael, u8 *key,
+int orinoco_mic(struct crypto_ahash *tfm_michael, u8 *key,
u8 *da, u8 *sa, u8 priority,
u8 *data, size_t data_len, u8 *mic)
 {
-   struct hash_desc desc;
+   AHASH_REQUEST_ON_STACK(req, tfm_michael);
struct scatterlist sg[2];
u8 hdr[ETH_HLEN + 2]; /* size of header + padding */
+   int err;
 
if (tfm_michael == NULL) {
printk(KERN_WARNING "orinoco_mic: tfm_michael == NULL\n");
@@ -69,11 +72,13 @@ int orinoco_mic(struct crypto_hash *tfm_michael, u8 *key,
sg_set_buf(&sg[0], hdr, sizeof(hdr));
sg_set_buf(&sg[1], data, data_len);
 
-   if (crypto_hash_setkey(tfm_michael, key, MIC_KEYLEN))
+   if (crypto_ahash_setkey(tfm_michael, key, MIC_KEYLEN))
return -1;
 
-   desc.tfm = tfm_michael;
-   desc.flags = 0;
-   return crypto_hash_digest(&desc, sg, data_len + sizeof(hdr),
- mic);
+   ahash_request_set_tfm(req, tfm_michael);
+   ahash_request_set_callback(req, 0, NULL, NULL);
+   ahash_request_set_crypt(req, sg, mic, data_len + sizeof(hdr));
+   err = crypto_ahash_digest(req);
+   ahash_request_zero(req);
+   return err;
 }
diff --git a/drivers/net/wireless/intersil/orinoco/mic.h 
b/drivers/net/wireless/intersil/orinoco/mic.h
index 04d05bc..ce731d0 100644
--- a/drivers/net/wireless/intersil/orinoco/mic.h
+++ b/drivers/net/wireless/intersil/orinoco/mic.h
@@ -11,11 +11,11 @@
 
 /* Forward declarations */
 struct orinoco_private;
-struct crypto_hash;
+struct crypto_ahash;
 
 int orinoco_mic_init(struct orinoco_private *priv);
 void orinoco_mic_free(struct orinoco_private *priv);
-int orinoco_mic(struct crypto_hash *tfm_michael, u8 *key,
+int orinoco_mic(struct crypto_ahash *tfm_michael, u8 *key,
u8 *da, u8 *sa, u8 priority,
u8 *data, size_t data_len, u8 *mic);
 
diff --git a/drivers/net/wireless/intersil/orinoco/orinoco.h 
b/drivers/net/wireless/intersil/orinoco/orinoco.h
index eebd2be..2f0c84b 100644
--- a/drivers/net/wireless/intersil/orinoco/orinoco.h
+++ b/drivers/net/wireless/intersil/orinoco/orinoco.h
@@ -152,8 +152,8 @@ struct orinoco_private {
u8 *wpa_ie;
int wpa_ie_len;
 
-   struct crypto_hash *rx_tfm_mic;
-   struct crypto_hash *tx_tfm_mic;
+   struct crypto_ahash *rx_tfm_mic;
+   struct crypto_ahash *tx_tfm_mic;
 
unsigned int wpa_enabled:1;
unsigned int tkip_cm_active:1;
--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 6/26] staging: rtl8192u: Use skcipher and ahash

2016-01-24 Thread Herbert Xu
This patch replaces uses of blkcipher with skcipher, and the long
obsolete hash interface with ahash.

Signed-off-by: Herbert Xu 
---

 drivers/staging/rtl8192u/ieee80211/ieee80211_crypt_tkip.c |   92 +++---
 drivers/staging/rtl8192u/ieee80211/ieee80211_crypt_wep.c  |   46 ---
 2 files changed, 81 insertions(+), 57 deletions(-)

diff --git a/drivers/staging/rtl8192u/ieee80211/ieee80211_crypt_tkip.c 
b/drivers/staging/rtl8192u/ieee80211/ieee80211_crypt_tkip.c
index 908bc2e..6fa96d5 100644
--- a/drivers/staging/rtl8192u/ieee80211/ieee80211_crypt_tkip.c
+++ b/drivers/staging/rtl8192u/ieee80211/ieee80211_crypt_tkip.c
@@ -21,7 +21,8 @@
 
 #include "ieee80211.h"
 
-#include 
+#include 
+#include 
#include 
 #include 
 
@@ -52,10 +53,10 @@ struct ieee80211_tkip_data {
 
int key_idx;
 
-   struct crypto_blkcipher *rx_tfm_arc4;
-   struct crypto_hash *rx_tfm_michael;
-   struct crypto_blkcipher *tx_tfm_arc4;
-   struct crypto_hash *tx_tfm_michael;
+   struct crypto_skcipher *rx_tfm_arc4;
+   struct crypto_ahash *rx_tfm_michael;
+   struct crypto_skcipher *tx_tfm_arc4;
+   struct crypto_ahash *tx_tfm_michael;
 
/* scratch buffers for virt_to_page() (crypto API) */
u8 rx_hdr[16], tx_hdr[16];
@@ -70,7 +71,7 @@ static void *ieee80211_tkip_init(int key_idx)
goto fail;
priv->key_idx = key_idx;
 
-   priv->tx_tfm_arc4 = crypto_alloc_blkcipher("ecb(arc4)", 0,
+   priv->tx_tfm_arc4 = crypto_alloc_skcipher("ecb(arc4)", 0,
CRYPTO_ALG_ASYNC);
if (IS_ERR(priv->tx_tfm_arc4)) {
printk(KERN_DEBUG "ieee80211_crypt_tkip: could not allocate "
@@ -79,7 +80,7 @@ static void *ieee80211_tkip_init(int key_idx)
goto fail;
}
 
-   priv->tx_tfm_michael = crypto_alloc_hash("michael_mic", 0,
+   priv->tx_tfm_michael = crypto_alloc_ahash("michael_mic", 0,
CRYPTO_ALG_ASYNC);
if (IS_ERR(priv->tx_tfm_michael)) {
printk(KERN_DEBUG "ieee80211_crypt_tkip: could not allocate "
@@ -88,7 +89,7 @@ static void *ieee80211_tkip_init(int key_idx)
goto fail;
}
 
-   priv->rx_tfm_arc4 = crypto_alloc_blkcipher("ecb(arc4)", 0,
+   priv->rx_tfm_arc4 = crypto_alloc_skcipher("ecb(arc4)", 0,
CRYPTO_ALG_ASYNC);
if (IS_ERR(priv->rx_tfm_arc4)) {
printk(KERN_DEBUG "ieee80211_crypt_tkip: could not allocate "
@@ -97,7 +98,7 @@ static void *ieee80211_tkip_init(int key_idx)
goto fail;
}
 
-   priv->rx_tfm_michael = crypto_alloc_hash("michael_mic", 0,
+   priv->rx_tfm_michael = crypto_alloc_ahash("michael_mic", 0,
CRYPTO_ALG_ASYNC);
if (IS_ERR(priv->rx_tfm_michael)) {
printk(KERN_DEBUG "ieee80211_crypt_tkip: could not allocate "
@@ -110,14 +111,10 @@ static void *ieee80211_tkip_init(int key_idx)
 
 fail:
if (priv) {
-   if (priv->tx_tfm_michael)
-   crypto_free_hash(priv->tx_tfm_michael);
-   if (priv->tx_tfm_arc4)
-   crypto_free_blkcipher(priv->tx_tfm_arc4);
-   if (priv->rx_tfm_michael)
-   crypto_free_hash(priv->rx_tfm_michael);
-   if (priv->rx_tfm_arc4)
-   crypto_free_blkcipher(priv->rx_tfm_arc4);
+   crypto_free_ahash(priv->tx_tfm_michael);
+   crypto_free_skcipher(priv->tx_tfm_arc4);
+   crypto_free_ahash(priv->rx_tfm_michael);
+   crypto_free_skcipher(priv->rx_tfm_arc4);
kfree(priv);
}
 
@@ -130,14 +127,10 @@ static void ieee80211_tkip_deinit(void *priv)
struct ieee80211_tkip_data *_priv = priv;
 
if (_priv) {
-   if (_priv->tx_tfm_michael)
-   crypto_free_hash(_priv->tx_tfm_michael);
-   if (_priv->tx_tfm_arc4)
-   crypto_free_blkcipher(_priv->tx_tfm_arc4);
-   if (_priv->rx_tfm_michael)
-   crypto_free_hash(_priv->rx_tfm_michael);
-   if (_priv->rx_tfm_arc4)
-   crypto_free_blkcipher(_priv->rx_tfm_arc4);
+   crypto_free_ahash(_priv->tx_tfm_michael);
+   crypto_free_skcipher(_priv->tx_tfm_arc4);
+   crypto_free_ahash(_priv->rx_tfm_michael);
+   crypto_free_skcipher(_priv->rx_tfm_arc4);
}
kfree(priv);
 }
@@ -312,7 +305,6 @@ static int ieee80211_tkip_encrypt(struct sk_buff *skb, int 
hdr_len, void *priv)
u8 *pos;
struct rtl_80211_hdr_4addr *hdr;
cb_desc *tcb_desc = (cb_desc *)(skb->cb + MAX_DEV_ADDR_SIZE);
-   struct blkcipher_desc desc = {.tfm = tkey->tx_tfm_arc4};
int ret = 0;
u8 rc4key[16],  *icv;
u32 crc;
@@ -357,15 +349,21 @@ static int ieee80211_tkip_encrypt(struct sk_buff *skb, 
int hdr_len, void *priv)

[PATCH 4/26] dm crypt: Use skcipher and ahash

2016-01-24 Thread Herbert Xu
This patch replaces uses of ablkcipher with skcipher, and the long
obsolete hash interface with ahash.

Signed-off-by: Herbert Xu 
---

 drivers/md/dm-crypt.c |   93 +-
 1 file changed, 48 insertions(+), 45 deletions(-)

diff --git a/drivers/md/dm-crypt.c b/drivers/md/dm-crypt.c
index 3147c8d..06a4e3c 100644
--- a/drivers/md/dm-crypt.c
+++ b/drivers/md/dm-crypt.c
@@ -28,6 +28,7 @@
 #include 
 #include 
 #include 
+#include 
 
 #include 
 
@@ -44,7 +45,7 @@ struct convert_context {
struct bvec_iter iter_out;
sector_t cc_sector;
atomic_t cc_pending;
-   struct ablkcipher_request *req;
+   struct skcipher_request *req;
 };
 
 /*
@@ -86,7 +87,7 @@ struct crypt_iv_operations {
 };
 
 struct iv_essiv_private {
-   struct crypto_hash *hash_tfm;
+   struct crypto_ahash *hash_tfm;
u8 *salt;
 };
 
@@ -153,13 +154,13 @@ struct crypt_config {
 
/* ESSIV: struct crypto_cipher *essiv_tfm */
void *iv_private;
-   struct crypto_ablkcipher **tfms;
+   struct crypto_skcipher **tfms;
unsigned tfms_count;
 
/*
 * Layout of each crypto request:
 *
-*   struct ablkcipher_request
+*   struct skcipher_request
 *  context
 *  padding
 *   struct dm_crypt_request
@@ -189,7 +190,7 @@ static u8 *iv_of_dmreq(struct crypt_config *cc, struct 
dm_crypt_request *dmreq);
 /*
  * Use this to access cipher attributes that are the same for each CPU.
  */
-static struct crypto_ablkcipher *any_tfm(struct crypt_config *cc)
+static struct crypto_skcipher *any_tfm(struct crypt_config *cc)
 {
return cc->tfms[0];
 }
@@ -263,23 +264,25 @@ static int crypt_iv_plain64_gen(struct crypt_config *cc, 
u8 *iv,
 static int crypt_iv_essiv_init(struct crypt_config *cc)
 {
struct iv_essiv_private *essiv = &cc->iv_gen_private.essiv;
-   struct hash_desc desc;
+   AHASH_REQUEST_ON_STACK(req, essiv->hash_tfm);
struct scatterlist sg;
struct crypto_cipher *essiv_tfm;
int err;
 
sg_init_one(&sg, cc->key, cc->key_size);
-   desc.tfm = essiv->hash_tfm;
-   desc.flags = CRYPTO_TFM_REQ_MAY_SLEEP;
+   ahash_request_set_tfm(req, essiv->hash_tfm);
+   ahash_request_set_callback(req, CRYPTO_TFM_REQ_MAY_SLEEP, NULL, NULL);
+   ahash_request_set_crypt(req, &sg, essiv->salt, cc->key_size);
 
-   err = crypto_hash_digest(&desc, &sg, cc->key_size, essiv->salt);
+   err = crypto_ahash_digest(req);
+   ahash_request_zero(req);
if (err)
return err;
 
essiv_tfm = cc->iv_private;
 
err = crypto_cipher_setkey(essiv_tfm, essiv->salt,
-   crypto_hash_digestsize(essiv->hash_tfm));
+   crypto_ahash_digestsize(essiv->hash_tfm));
if (err)
return err;
 
@@ -290,7 +293,7 @@ static int crypt_iv_essiv_init(struct crypt_config *cc)
 static int crypt_iv_essiv_wipe(struct crypt_config *cc)
 {
struct iv_essiv_private *essiv = &cc->iv_gen_private.essiv;
-   unsigned salt_size = crypto_hash_digestsize(essiv->hash_tfm);
+   unsigned salt_size = crypto_ahash_digestsize(essiv->hash_tfm);
struct crypto_cipher *essiv_tfm;
int r, err = 0;
 
@@ -320,7 +323,7 @@ static struct crypto_cipher *setup_essiv_cpu(struct 
crypt_config *cc,
}
 
if (crypto_cipher_blocksize(essiv_tfm) !=
-   crypto_ablkcipher_ivsize(any_tfm(cc))) {
+   crypto_skcipher_ivsize(any_tfm(cc))) {
ti->error = "Block size of ESSIV cipher does "
"not match IV size of block cipher";
crypto_free_cipher(essiv_tfm);
@@ -342,7 +345,7 @@ static void crypt_iv_essiv_dtr(struct crypt_config *cc)
struct crypto_cipher *essiv_tfm;
struct iv_essiv_private *essiv = &cc->iv_gen_private.essiv;
 
-   crypto_free_hash(essiv->hash_tfm);
+   crypto_free_ahash(essiv->hash_tfm);
essiv->hash_tfm = NULL;
 
kzfree(essiv->salt);
@@ -360,7 +363,7 @@ static int crypt_iv_essiv_ctr(struct crypt_config *cc, 
struct dm_target *ti,
  const char *opts)
 {
struct crypto_cipher *essiv_tfm = NULL;
-   struct crypto_hash *hash_tfm = NULL;
+   struct crypto_ahash *hash_tfm = NULL;
u8 *salt = NULL;
int err;
 
@@ -370,14 +373,14 @@ static int crypt_iv_essiv_ctr(struct crypt_config *cc, 
struct dm_target *ti,
}
 
/* Allocate hash algorithm */
-   hash_tfm = crypto_alloc_hash(opts, 0, CRYPTO_ALG_ASYNC);
+   hash_tfm = crypto_alloc_ahash(opts, 0, CRYPTO_ALG_ASYNC);
if (IS_ERR(hash_tfm)) {
ti->error = "Error initializing ESSIV hash";
err = PTR_ERR(hash_tfm);
goto bad;
}
 
-   salt = kzalloc(crypto_hash_digestsize(hash_tfm), GFP_KERNEL);
+   salt = kzalloc(crypto_ahash_digestsize(

[PATCH 2/26] ppp_mppe: Use skcipher and ahash

2016-01-24 Thread Herbert Xu
This patch replaces uses of blkcipher with skcipher, and the long
obsolete hash interface with ahash.  This is a bug-for-bug conversion
and no attempt has been made to fix bugs such as the ignored return
values of the crypto operations.

Signed-off-by: Herbert Xu 
---

 drivers/net/ppp/ppp_mppe.c |   99 ++---
 1 file changed, 58 insertions(+), 41 deletions(-)

diff --git a/drivers/net/ppp/ppp_mppe.c b/drivers/net/ppp/ppp_mppe.c
index 05005c6..f60f766 100644
--- a/drivers/net/ppp/ppp_mppe.c
+++ b/drivers/net/ppp/ppp_mppe.c
@@ -42,6 +42,8 @@
  *deprecated in 2.6
  */
 
+#include 
+#include 
 #include 
 #include 
 #include 
@@ -49,7 +51,6 @@
 #include 
 #include 
 #include 
-#include 
 #include 
 #include 
 #include 
@@ -94,8 +95,8 @@ static inline void sha_pad_init(struct sha_pad *shapad)
  * State for an MPPE (de)compressor.
  */
 struct ppp_mppe_state {
-   struct crypto_blkcipher *arc4;
-   struct crypto_hash *sha1;
+   struct crypto_skcipher *arc4;
+   struct crypto_ahash *sha1;
unsigned char *sha1_digest;
unsigned char master_key[MPPE_MAX_KEY_LEN];
unsigned char session_key[MPPE_MAX_KEY_LEN];
@@ -135,7 +136,7 @@ struct ppp_mppe_state {
  */
 static void get_new_key_from_sha(struct ppp_mppe_state * state)
 {
-   struct hash_desc desc;
+   AHASH_REQUEST_ON_STACK(req, state->sha1);
struct scatterlist sg[4];
unsigned int nbytes;
 
@@ -148,10 +149,12 @@ static void get_new_key_from_sha(struct ppp_mppe_state * 
state)
nbytes += setup_sg(&sg[3], sha_pad->sha_pad2,
   sizeof(sha_pad->sha_pad2));
 
-   desc.tfm = state->sha1;
-   desc.flags = 0;
+   ahash_request_set_tfm(req, state->sha1);
+   ahash_request_set_callback(req, 0, NULL, NULL);
+   ahash_request_set_crypt(req, sg, state->sha1_digest, nbytes);
 
-   crypto_hash_digest(&desc, sg, nbytes, state->sha1_digest);
+   crypto_ahash_digest(req);
+   ahash_request_zero(req);
 }
 
 /*
@@ -161,20 +164,23 @@ static void get_new_key_from_sha(struct ppp_mppe_state * 
state)
 static void mppe_rekey(struct ppp_mppe_state * state, int initial_key)
 {
struct scatterlist sg_in[1], sg_out[1];
-   struct blkcipher_desc desc = { .tfm = state->arc4 };
+   SKCIPHER_REQUEST_ON_STACK(req, state->arc4);
+
+   skcipher_request_set_tfm(req, state->arc4);
+   skcipher_request_set_callback(req, 0, NULL, NULL);
 
get_new_key_from_sha(state);
if (!initial_key) {
-   crypto_blkcipher_setkey(state->arc4, state->sha1_digest,
-   state->keylen);
+   crypto_skcipher_setkey(state->arc4, state->sha1_digest,
+  state->keylen);
sg_init_table(sg_in, 1);
sg_init_table(sg_out, 1);
setup_sg(sg_in, state->sha1_digest, state->keylen);
setup_sg(sg_out, state->session_key, state->keylen);
-   if (crypto_blkcipher_encrypt(&desc, sg_out, sg_in,
-state->keylen) != 0) {
+   skcipher_request_set_crypt(req, sg_in, sg_out, state->keylen,
+  NULL);
+   if (crypto_skcipher_encrypt(req))
printk(KERN_WARNING "mppe_rekey: cipher_encrypt failed\n");
-   }
} else {
memcpy(state->session_key, state->sha1_digest, state->keylen);
}
@@ -184,7 +190,8 @@ static void mppe_rekey(struct ppp_mppe_state * state, int 
initial_key)
state->session_key[1] = 0x26;
state->session_key[2] = 0x9e;
}
-   crypto_blkcipher_setkey(state->arc4, state->session_key, state->keylen);
+   crypto_skcipher_setkey(state->arc4, state->session_key, state->keylen);
+   skcipher_request_zero(req);
 }
 
 /*
@@ -204,19 +211,19 @@ static void *mppe_alloc(unsigned char *options, int 
optlen)
goto out;
 
 
-   state->arc4 = crypto_alloc_blkcipher("ecb(arc4)", 0, CRYPTO_ALG_ASYNC);
+   state->arc4 = crypto_alloc_skcipher("ecb(arc4)", 0, CRYPTO_ALG_ASYNC);
if (IS_ERR(state->arc4)) {
state->arc4 = NULL;
goto out_free;
}
 
-   state->sha1 = crypto_alloc_hash("sha1", 0, CRYPTO_ALG_ASYNC);
+   state->sha1 = crypto_alloc_ahash("sha1", 0, CRYPTO_ALG_ASYNC);
if (IS_ERR(state->sha1)) {
state->sha1 = NULL;
goto out_free;
}
 
-   digestsize = crypto_hash_digestsize(state->sha1);
+   digestsize = crypto_ahash_digestsize(state->sha1);
if (digestsize < MPPE_MAX_KEY_LEN)
goto out_free;
 
@@ -237,15 +244,12 @@ static void *mppe_alloc(unsigned char *options, int 
optlen)
 
return (void *)state;
 
-   out_free:
-   if (state->sha1_digest)
-   kfree(state->sha1_digest);
-   

Re: [PATCH 1/26] block: cryptoloop - Use new skcipher interface

2016-01-24 Thread kbuild test robot
Hi Herbert,

[auto build test ERROR on net/master]
[also build test ERROR on v4.4 next-20160122]
[if your patch is applied to the wrong git tree, please drop us a note to help 
improving the system]

url:
https://github.com/0day-ci/linux/commits/Herbert-Xu/crypto-Use-skcipher-and-ahash-shash-where-possible/20160124-212323
config: x86_64-randconfig-x014-201604 (attached as .config)
reproduce:
# save the attached .config to linux build tree
make ARCH=x86_64 

All errors (new ones prefixed by >>):

   drivers/block/cryptoloop.c: In function 'cryptoloop_transfer':
>> drivers/block/cryptoloop.c:167:2: error: implicit declaration of function 
>> 'skcipher_request_zero' [-Werror=implicit-function-declaration]
 skcipher_request_zero(req);
 ^
   cc1: some warnings being treated as errors

vim +/skcipher_request_zero +167 drivers/block/cryptoloop.c

   161  out_offs += sz;
   162  }
   163  
   164  err = 0;
   165  
   166  out:
 > 167  skcipher_request_zero(req);
   168  return err;
   169  }
   170  

---
0-DAY kernel test infrastructureOpen Source Technology Center
https://lists.01.org/pipermail/kbuild-all   Intel Corporation


.config.gz
Description: Binary data


[PATCH 17/26] mac802154: Use skcipher

2016-01-24 Thread Herbert Xu
This patch replaces uses of blkcipher with skcipher.
   
Signed-off-by: Herbert Xu 
---

 net/mac802154/llsec.c |   41 +++--
 net/mac802154/llsec.h |3 +--
 2 files changed, 24 insertions(+), 20 deletions(-)

diff --git a/net/mac802154/llsec.c b/net/mac802154/llsec.c
index a13d02b..6a3e1c2 100644
--- a/net/mac802154/llsec.c
+++ b/net/mac802154/llsec.c
@@ -17,9 +17,9 @@
 #include 
 #include 
 #include 
-#include 
 #include 
 #include 
+#include 
 
 #include "ieee802154_i.h"
 #include "llsec.h"
@@ -144,18 +144,18 @@ llsec_key_alloc(const struct ieee802154_llsec_key 
*template)
goto err_tfm;
}
 
-   key->tfm0 = crypto_alloc_blkcipher("ctr(aes)", 0, CRYPTO_ALG_ASYNC);
+   key->tfm0 = crypto_alloc_skcipher("ctr(aes)", 0, CRYPTO_ALG_ASYNC);
if (IS_ERR(key->tfm0))
goto err_tfm;
 
-   if (crypto_blkcipher_setkey(key->tfm0, template->key,
-   IEEE802154_LLSEC_KEY_SIZE))
+   if (crypto_skcipher_setkey(key->tfm0, template->key,
+  IEEE802154_LLSEC_KEY_SIZE))
goto err_tfm0;
 
return key;
 
 err_tfm0:
-   crypto_free_blkcipher(key->tfm0);
+   crypto_free_skcipher(key->tfm0);
 err_tfm:
for (i = 0; i < ARRAY_SIZE(key->tfm); i++)
if (key->tfm[i])
@@ -175,7 +175,7 @@ static void llsec_key_release(struct kref *ref)
for (i = 0; i < ARRAY_SIZE(key->tfm); i++)
crypto_free_aead(key->tfm[i]);
 
-   crypto_free_blkcipher(key->tfm0);
+   crypto_free_skcipher(key->tfm0);
kzfree(key);
 }
 
@@ -620,15 +620,17 @@ llsec_do_encrypt_unauth(struct sk_buff *skb, const struct 
mac802154_llsec *sec,
 {
u8 iv[16];
struct scatterlist src;
-   struct blkcipher_desc req = {
-   .tfm = key->tfm0,
-   .info = iv,
-   .flags = 0,
-   };
+   SKCIPHER_REQUEST_ON_STACK(req, key->tfm0);
+   int err;
 
llsec_geniv(iv, sec->params.hwaddr, &hdr->sec);
sg_init_one(&src, skb->data, skb->len);
-   return crypto_blkcipher_encrypt_iv(&req, &src, &src, skb->len);
+   skcipher_request_set_tfm(req, key->tfm0);
+   skcipher_request_set_callback(req, 0, NULL, NULL);
+   skcipher_request_set_crypt(req, &src, &src, skb->len, iv);
+   err = crypto_skcipher_encrypt(req);
+   skcipher_request_zero(req);
+   return err;
 }
 
 static struct crypto_aead*
@@ -830,11 +832,8 @@ llsec_do_decrypt_unauth(struct sk_buff *skb, const struct 
mac802154_llsec *sec,
unsigned char *data;
int datalen;
struct scatterlist src;
-   struct blkcipher_desc req = {
-   .tfm = key->tfm0,
-   .info = iv,
-   .flags = 0,
-   };
+   SKCIPHER_REQUEST_ON_STACK(req, key->tfm0);
+   int err;
 
llsec_geniv(iv, dev_addr, &hdr->sec);
data = skb_mac_header(skb) + skb->mac_len;
@@ -842,7 +841,13 @@ llsec_do_decrypt_unauth(struct sk_buff *skb, const struct 
mac802154_llsec *sec,
 
sg_init_one(&src, data, datalen);
 
-   return crypto_blkcipher_decrypt_iv(&req, &src, &src, datalen);
+   skcipher_request_set_tfm(req, key->tfm0);
+   skcipher_request_set_callback(req, 0, NULL, NULL);
+   skcipher_request_set_crypt(req, &src, &src, datalen, iv);
+
+   err = crypto_skcipher_decrypt(req);
+   skcipher_request_zero(req);
+   return err;
 }
 
 static int
diff --git a/net/mac802154/llsec.h b/net/mac802154/llsec.h
index 950578e..6f3b658 100644
--- a/net/mac802154/llsec.h
+++ b/net/mac802154/llsec.h
@@ -19,7 +19,6 @@
 
 #include 
 #include 
-#include 
 #include 
 #include 
 #include 
@@ -30,7 +29,7 @@ struct mac802154_llsec_key {
 
/* one tfm for each authsize (4/8/16) */
struct crypto_aead *tfm[3];
-   struct crypto_blkcipher *tfm0;
+   struct crypto_skcipher *tfm0;
 
struct kref ref;
 };
--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 15/26] Bluetooth: Use skcipher and hash

2016-01-24 Thread Herbert Xu
This patch replaces uses of blkcipher with skcipher and the long
obsolete hash interface with shash.
   
Signed-off-by: Herbert Xu 
---

 net/bluetooth/smp.c |  135 
 1 file changed, 63 insertions(+), 72 deletions(-)

diff --git a/net/bluetooth/smp.c b/net/bluetooth/smp.c
index ffed8a1..78ad7d6 100644
--- a/net/bluetooth/smp.c
+++ b/net/bluetooth/smp.c
@@ -21,9 +21,10 @@
 */
 
 #include 
-#include 
 #include 
 #include 
+#include 
+#include 
 
 #include 
 #include 
@@ -87,8 +88,8 @@ struct smp_dev {
u8  min_key_size;
u8  max_key_size;
 
-   struct crypto_blkcipher *tfm_aes;
-   struct crypto_hash  *tfm_cmac;
+   struct crypto_skcipher  *tfm_aes;
+   struct crypto_shash *tfm_cmac;
 };
 
 struct smp_chan {
@@ -126,8 +127,8 @@ struct smp_chan {
u8  dhkey[32];
u8  mackey[16];
 
-   struct crypto_blkcipher *tfm_aes;
-   struct crypto_hash  *tfm_cmac;
+   struct crypto_skcipher  *tfm_aes;
+   struct crypto_shash *tfm_cmac;
 };
 
 /* These debug key values are defined in the SMP section of the core
@@ -165,12 +166,11 @@ static inline void swap_buf(const u8 *src, u8 *dst, 
size_t len)
  * AES-CMAC, f4, f5, f6, g2 and h6.
  */
 
-static int aes_cmac(struct crypto_hash *tfm, const u8 k[16], const u8 *m,
+static int aes_cmac(struct crypto_shash *tfm, const u8 k[16], const u8 *m,
size_t len, u8 mac[16])
 {
uint8_t tmp[16], mac_msb[16], msg_msb[CMAC_MSG_MAX];
-   struct hash_desc desc;
-   struct scatterlist sg;
+   SHASH_DESC_ON_STACK(desc, tfm);
int err;
 
if (len > CMAC_MSG_MAX)
@@ -181,10 +181,8 @@ static int aes_cmac(struct crypto_hash *tfm, const u8 
k[16], const u8 *m,
return -EINVAL;
}
 
-   desc.tfm = tfm;
-   desc.flags = 0;
-
-   crypto_hash_init(&desc);
+   desc->tfm = tfm;
+   desc->flags = 0;
 
/* Swap key and message from LSB to MSB */
swap_buf(k, tmp, 16);
@@ -193,23 +191,16 @@ static int aes_cmac(struct crypto_hash *tfm, const u8 
k[16], const u8 *m,
SMP_DBG("msg (len %zu) %*phN", len, (int) len, m);
SMP_DBG("key %16phN", k);
 
-   err = crypto_hash_setkey(tfm, tmp, 16);
+   err = crypto_shash_setkey(tfm, tmp, 16);
if (err) {
BT_ERR("cipher setkey failed: %d", err);
return err;
}
 
-   sg_init_one(&sg, msg_msb, len);
-
-   err = crypto_hash_update(&desc, &sg, len);
+   err = crypto_shash_digest(desc, msg_msb, len, mac_msb);
+   shash_desc_zero(desc);
if (err) {
-   BT_ERR("Hash update error %d", err);
-   return err;
-   }
-
-   err = crypto_hash_final(&desc, mac_msb);
-   if (err) {
-   BT_ERR("Hash final error %d", err);
+   BT_ERR("Hash computation error %d", err);
return err;
}
 
@@ -220,8 +211,8 @@ static int aes_cmac(struct crypto_hash *tfm, const u8 
k[16], const u8 *m,
return 0;
 }
 
-static int smp_f4(struct crypto_hash *tfm_cmac, const u8 u[32], const u8 v[32],
- const u8 x[16], u8 z, u8 res[16])
+static int smp_f4(struct crypto_shash *tfm_cmac, const u8 u[32],
+ const u8 v[32], const u8 x[16], u8 z, u8 res[16])
 {
u8 m[65];
int err;
@@ -243,7 +234,7 @@ static int smp_f4(struct crypto_hash *tfm_cmac, const u8 
u[32], const u8 v[32],
return err;
 }
 
-static int smp_f5(struct crypto_hash *tfm_cmac, const u8 w[32],
+static int smp_f5(struct crypto_shash *tfm_cmac, const u8 w[32],
  const u8 n1[16], const u8 n2[16], const u8 a1[7],
  const u8 a2[7], u8 mackey[16], u8 ltk[16])
 {
@@ -296,7 +287,7 @@ static int smp_f5(struct crypto_hash *tfm_cmac, const u8 
w[32],
return 0;
 }
 
-static int smp_f6(struct crypto_hash *tfm_cmac, const u8 w[16],
+static int smp_f6(struct crypto_shash *tfm_cmac, const u8 w[16],
  const u8 n1[16], const u8 n2[16], const u8 r[16],
  const u8 io_cap[3], const u8 a1[7], const u8 a2[7],
  u8 res[16])
@@ -324,7 +315,7 @@ static int smp_f6(struct crypto_hash *tfm_cmac, const u8 
w[16],
return err;
 }
 
-static int smp_g2(struct crypto_hash *tfm_cmac, const u8 u[32], const u8 v[32],
+static int smp_g2(struct crypto_shash *tfm_cmac, const u8 u[32], const u8 
v[32],
  const u8 x[16], const u8 y[16], u32 *val)
 {
u8 m[80], tmp[16];
@@ -350,7 +341,7 @@ static int smp_g2(struct crypto_hash *tfm_cmac, const u8 
u[32], const u8 v[32],
return 0;
 }
 
-static int smp_h6(struct crypto_hash *tfm_cmac, const u8 w[16],
+static int smp_h6(struct crypto_shash *tfm_cmac, const u8 w[16],
  const u8 key_id[4], u8 res[16])
 {
int err;
@@ -370,9 +361,9 @@ static int smp_h6(struct crypt

[PATCH 22/26] iscsi_tcp: Use ahash

2016-01-24 Thread Herbert Xu
This patch replaces uses of the long obsolete hash interface with
ahash.

Signed-off-by: Herbert Xu 
---

 drivers/scsi/iscsi_tcp.c|   54 ++--
 drivers/scsi/iscsi_tcp.h|4 +--
 drivers/scsi/libiscsi_tcp.c |   29 +--
 include/scsi/libiscsi_tcp.h |   13 +-
 4 files changed, 58 insertions(+), 42 deletions(-)

diff --git a/drivers/scsi/iscsi_tcp.c b/drivers/scsi/iscsi_tcp.c
index 0b8af18..2e4c82f 100644
--- a/drivers/scsi/iscsi_tcp.c
+++ b/drivers/scsi/iscsi_tcp.c
@@ -26,12 +26,12 @@
  * Zhenyu Wang
  */
 
+#include 
 #include 
 #include 
 #include 
 #include 
 #include 
-#include 
 #include 
 #include 
 #include 
@@ -428,7 +428,7 @@ static void iscsi_sw_tcp_send_hdr_prep(struct iscsi_conn 
*conn, void *hdr,
 * sufficient room.
 */
if (conn->hdrdgst_en) {
-   iscsi_tcp_dgst_header(&tcp_sw_conn->tx_hash, hdr, hdrlen,
+   iscsi_tcp_dgst_header(tcp_sw_conn->tx_hash, hdr, hdrlen,
  hdr + hdrlen);
hdrlen += ISCSI_DIGEST_SIZE;
}
@@ -454,7 +454,7 @@ iscsi_sw_tcp_send_data_prep(struct iscsi_conn *conn, struct 
scatterlist *sg,
 {
struct iscsi_tcp_conn *tcp_conn = conn->dd_data;
struct iscsi_sw_tcp_conn *tcp_sw_conn = tcp_conn->dd_data;
-   struct hash_desc *tx_hash = NULL;
+   struct ahash_request *tx_hash = NULL;
unsigned int hdr_spec_len;
 
ISCSI_SW_TCP_DBG(conn, "offset=%d, datalen=%d %s\n", offset, len,
@@ -467,7 +467,7 @@ iscsi_sw_tcp_send_data_prep(struct iscsi_conn *conn, struct 
scatterlist *sg,
WARN_ON(iscsi_padded(len) != iscsi_padded(hdr_spec_len));
 
if (conn->datadgst_en)
-   tx_hash = &tcp_sw_conn->tx_hash;
+   tx_hash = tcp_sw_conn->tx_hash;
 
return iscsi_segment_seek_sg(&tcp_sw_conn->out.data_segment,
 sg, count, offset, len,
@@ -480,7 +480,7 @@ iscsi_sw_tcp_send_linear_data_prep(struct iscsi_conn *conn, 
void *data,
 {
struct iscsi_tcp_conn *tcp_conn = conn->dd_data;
struct iscsi_sw_tcp_conn *tcp_sw_conn = tcp_conn->dd_data;
-   struct hash_desc *tx_hash = NULL;
+   struct ahash_request *tx_hash = NULL;
unsigned int hdr_spec_len;
 
ISCSI_SW_TCP_DBG(conn, "datalen=%zd %s\n", len, conn->datadgst_en ?
@@ -492,7 +492,7 @@ iscsi_sw_tcp_send_linear_data_prep(struct iscsi_conn *conn, 
void *data,
WARN_ON(iscsi_padded(len) != iscsi_padded(hdr_spec_len));
 
if (conn->datadgst_en)
-   tx_hash = &tcp_sw_conn->tx_hash;
+   tx_hash = tcp_sw_conn->tx_hash;
 
iscsi_segment_init_linear(&tcp_sw_conn->out.data_segment,
data, len, NULL, tx_hash);
@@ -543,6 +543,7 @@ iscsi_sw_tcp_conn_create(struct iscsi_cls_session 
*cls_session,
struct iscsi_cls_conn *cls_conn;
struct iscsi_tcp_conn *tcp_conn;
struct iscsi_sw_tcp_conn *tcp_sw_conn;
+   struct crypto_ahash *tfm;
 
cls_conn = iscsi_tcp_conn_setup(cls_session, sizeof(*tcp_sw_conn),
conn_idx);
@@ -552,23 +553,28 @@ iscsi_sw_tcp_conn_create(struct iscsi_cls_session 
*cls_session,
tcp_conn = conn->dd_data;
tcp_sw_conn = tcp_conn->dd_data;
 
-   tcp_sw_conn->tx_hash.tfm = crypto_alloc_hash("crc32c", 0,
-CRYPTO_ALG_ASYNC);
-   tcp_sw_conn->tx_hash.flags = 0;
-   if (IS_ERR(tcp_sw_conn->tx_hash.tfm))
+   tfm = crypto_alloc_ahash("crc32c", 0, CRYPTO_ALG_ASYNC);
+   if (IS_ERR(tfm))
goto free_conn;
 
-   tcp_sw_conn->rx_hash.tfm = crypto_alloc_hash("crc32c", 0,
-CRYPTO_ALG_ASYNC);
-   tcp_sw_conn->rx_hash.flags = 0;
-   if (IS_ERR(tcp_sw_conn->rx_hash.tfm))
-   goto free_tx_tfm;
-   tcp_conn->rx_hash = &tcp_sw_conn->rx_hash;
+   tcp_sw_conn->tx_hash = ahash_request_alloc(tfm, GFP_KERNEL);
+   if (!tcp_sw_conn->tx_hash)
+   goto free_tfm;
+   ahash_request_set_callback(tcp_sw_conn->tx_hash, 0, NULL, NULL);
+
+   tcp_sw_conn->rx_hash = ahash_request_alloc(tfm, GFP_KERNEL);
+   if (!tcp_sw_conn->rx_hash)
+   goto free_tx_hash;
+   ahash_request_set_callback(tcp_sw_conn->rx_hash, 0, NULL, NULL);
+
+   tcp_conn->rx_hash = tcp_sw_conn->rx_hash;
 
return cls_conn;
 
-free_tx_tfm:
-   crypto_free_hash(tcp_sw_conn->tx_hash.tfm);
+free_tx_hash:
+   ahash_request_free(tcp_sw_conn->tx_hash);
+free_tfm:
+   crypto_free_ahash(tfm);
 free_conn:
iscsi_conn_printk(KERN_ERR, conn,
  "Could not create connection due to crc32c "
@@ -607,10 +613,14 @@ static void iscsi_sw_tcp_conn_destroy(struct 
iscsi_cls_conn *cls_conn)
 
iscsi_sw_tcp_release_conn(conn);
 
-   if (tcp_sw_conn->tx_hash.tfm)
-   

[PATCH 7/26] wusb: Use skcipher

2016-01-24 Thread Herbert Xu
This patch replaces uses of blkcipher with skcipher.

Signed-off-by: Herbert Xu 
---

 drivers/usb/wusbcore/crypto.c |   30 --
 1 file changed, 16 insertions(+), 14 deletions(-)

diff --git a/drivers/usb/wusbcore/crypto.c b/drivers/usb/wusbcore/crypto.c
index 50ce80d..8ed8e34 100644
--- a/drivers/usb/wusbcore/crypto.c
+++ b/drivers/usb/wusbcore/crypto.c
@@ -45,6 +45,7 @@
  * funneled through AES are...16 bytes in size!
  */
 
+#include 
 #include 
 #include 
 #include 
@@ -195,21 +196,22 @@ static void bytewise_xor(void *_bo, const void *_bi1, 
const void *_bi2,
  * NOTE: blen is not aligned to a block size, we'll pad zeros, that's
  *   what sg[4] is for. Maybe there is a smarter way to do this.
  */
-static int wusb_ccm_mac(struct crypto_blkcipher *tfm_cbc,
+static int wusb_ccm_mac(struct crypto_skcipher *tfm_cbc,
struct crypto_cipher *tfm_aes, void *mic,
const struct aes_ccm_nonce *n,
const struct aes_ccm_label *a, const void *b,
size_t blen)
 {
int result = 0;
-   struct blkcipher_desc desc;
+   SKCIPHER_REQUEST_ON_STACK(req, tfm_cbc);
struct aes_ccm_b0 b0;
struct aes_ccm_b1 b1;
struct aes_ccm_a ax;
struct scatterlist sg[4], sg_dst;
-   void *iv, *dst_buf;
-   size_t ivsize, dst_size;
+   void *dst_buf;
+   size_t dst_size;
const u8 bzero[16] = { 0 };
+   u8 iv[crypto_skcipher_ivsize(tfm_cbc)];
size_t zero_padding;
 
/*
@@ -232,9 +234,7 @@ static int wusb_ccm_mac(struct crypto_blkcipher *tfm_cbc,
goto error_dst_buf;
}
 
-   iv = crypto_blkcipher_crt(tfm_cbc)->iv;
-   ivsize = crypto_blkcipher_ivsize(tfm_cbc);
-   memset(iv, 0, ivsize);
+   memset(iv, 0, sizeof(iv));
 
/* Setup B0 */
b0.flags = 0x59;/* Format B0 */
@@ -259,9 +259,11 @@ static int wusb_ccm_mac(struct crypto_blkcipher *tfm_cbc,
sg_set_buf(&sg[3], bzero, zero_padding);
sg_init_one(&sg_dst, dst_buf, dst_size);
 
-   desc.tfm = tfm_cbc;
-   desc.flags = 0;
-   result = crypto_blkcipher_encrypt(&desc, &sg_dst, sg, dst_size);
+   skcipher_request_set_tfm(req, tfm_cbc);
+   skcipher_request_set_callback(req, 0, NULL, NULL);
+   skcipher_request_set_crypt(req, sg, &sg_dst, dst_size, iv);
+   result = crypto_skcipher_encrypt(req);
+   skcipher_request_zero(req);
if (result < 0) {
printk(KERN_ERR "E: can't compute CBC-MAC tag (MIC): %d\n",
   result);
@@ -301,18 +303,18 @@ ssize_t wusb_prf(void *out, size_t out_size,
 {
ssize_t result, bytes = 0, bitr;
struct aes_ccm_nonce n = *_n;
-   struct crypto_blkcipher *tfm_cbc;
+   struct crypto_skcipher *tfm_cbc;
struct crypto_cipher *tfm_aes;
u64 sfn = 0;
__le64 sfn_le;
 
-   tfm_cbc = crypto_alloc_blkcipher("cbc(aes)", 0, CRYPTO_ALG_ASYNC);
+   tfm_cbc = crypto_alloc_skcipher("cbc(aes)", 0, CRYPTO_ALG_ASYNC);
if (IS_ERR(tfm_cbc)) {
result = PTR_ERR(tfm_cbc);
printk(KERN_ERR "E: can't load CBC(AES): %d\n", (int)result);
goto error_alloc_cbc;
}
-   result = crypto_blkcipher_setkey(tfm_cbc, key, 16);
+   result = crypto_skcipher_setkey(tfm_cbc, key, 16);
if (result < 0) {
printk(KERN_ERR "E: can't set CBC key: %d\n", (int)result);
goto error_setkey_cbc;
@@ -345,7 +347,7 @@ error_setkey_aes:
crypto_free_cipher(tfm_aes);
 error_alloc_aes:
 error_setkey_cbc:
-   crypto_free_blkcipher(tfm_cbc);
+   crypto_free_skcipher(tfm_cbc);
 error_alloc_cbc:
return result;
 }
--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 25/26] sctp: Use shash

2016-01-24 Thread Herbert Xu
This patch replaces uses of the long obsolete hash interface with
shash.

Signed-off-by: Herbert Xu 
---

 include/net/sctp/auth.h|4 +--
 include/net/sctp/structs.h |6 ++---
 net/sctp/auth.c|   36 ---
 net/sctp/endpointola.c |1 
 net/sctp/sm_make_chunk.c   |   51 +
 net/sctp/socket.c  |8 +++
 6 files changed, 57 insertions(+), 49 deletions(-)

diff --git a/include/net/sctp/auth.h b/include/net/sctp/auth.h
index f2d58aa..9b9fb12 100644
--- a/include/net/sctp/auth.h
+++ b/include/net/sctp/auth.h
@@ -31,12 +31,12 @@
 #define __sctp_auth_h__
 
 #include 
-#include 
 
 struct sctp_endpoint;
 struct sctp_association;
 struct sctp_authkey;
 struct sctp_hmacalgo;
+struct crypto_shash;
 
 /*
  * Define a generic struct that will hold all the info
@@ -90,7 +90,7 @@ int sctp_auth_asoc_copy_shkeys(const struct sctp_endpoint *ep,
struct sctp_association *asoc,
gfp_t gfp);
 int sctp_auth_init_hmacs(struct sctp_endpoint *ep, gfp_t gfp);
-void sctp_auth_destroy_hmacs(struct crypto_hash *auth_hmacs[]);
+void sctp_auth_destroy_hmacs(struct crypto_shash *auth_hmacs[]);
 struct sctp_hmac *sctp_auth_get_hmac(__u16 hmac_id);
 struct sctp_hmac *sctp_auth_asoc_get_hmac(const struct sctp_association *asoc);
 void sctp_auth_asoc_set_default_hmac(struct sctp_association *asoc,
diff --git a/include/net/sctp/structs.h b/include/net/sctp/structs.h
index 20e7212..6b1e383 100644
--- a/include/net/sctp/structs.h
+++ b/include/net/sctp/structs.h
@@ -82,7 +82,7 @@ struct sctp_bind_addr;
 struct sctp_ulpq;
 struct sctp_ep_common;
 struct sctp_ssnmap;
-struct crypto_hash;
+struct crypto_shash;
 
 
 #include 
@@ -166,7 +166,7 @@ struct sctp_sock {
struct sctp_pf *pf;
 
/* Access to HMAC transform. */
-   struct crypto_hash *hmac;
+   struct crypto_shash *hmac;
char *sctp_hmac_alg;
 
/* What is our base endpointer? */
@@ -1235,7 +1235,7 @@ struct sctp_endpoint {
/* SCTP AUTH: array of the HMACs that will be allocated
 * we need this per association so that we don't serialize
 */
-   struct crypto_hash **auth_hmacs;
+   struct crypto_shash **auth_hmacs;
 
/* SCTP-AUTH: hmacs for the endpoint encoded into parameter */
 struct sctp_hmac_algo_param *auth_hmacs_list;
diff --git a/net/sctp/auth.c b/net/sctp/auth.c
index 1543e39..912eb16 100644
--- a/net/sctp/auth.c
+++ b/net/sctp/auth.c
@@ -27,9 +27,9 @@
  *   Vlad Yasevich 
  */
 
+#include 
 #include 
 #include 
-#include 
 #include 
 #include 
 #include 
@@ -448,7 +448,7 @@ struct sctp_shared_key *sctp_auth_get_shkey(
  */
 int sctp_auth_init_hmacs(struct sctp_endpoint *ep, gfp_t gfp)
 {
-   struct crypto_hash *tfm = NULL;
+   struct crypto_shash *tfm = NULL;
__u16   id;
 
/* If AUTH extension is disabled, we are done */
@@ -462,9 +462,8 @@ int sctp_auth_init_hmacs(struct sctp_endpoint *ep, gfp_t 
gfp)
return 0;
 
/* Allocated the array of pointers to transorms */
-   ep->auth_hmacs = kzalloc(
-   sizeof(struct crypto_hash *) * SCTP_AUTH_NUM_HMACS,
-   gfp);
+   ep->auth_hmacs = kzalloc(sizeof(struct crypto_shash *) *
+SCTP_AUTH_NUM_HMACS, gfp);
if (!ep->auth_hmacs)
return -ENOMEM;
 
@@ -483,8 +482,7 @@ int sctp_auth_init_hmacs(struct sctp_endpoint *ep, gfp_t 
gfp)
continue;
 
/* Allocate the ID */
-   tfm = crypto_alloc_hash(sctp_hmac_list[id].hmac_name, 0,
-   CRYPTO_ALG_ASYNC);
+   tfm = crypto_alloc_shash(sctp_hmac_list[id].hmac_name, 0, 0);
if (IS_ERR(tfm))
goto out_err;
 
@@ -500,7 +498,7 @@ out_err:
 }
 
 /* Destroy the hmac tfm array */
-void sctp_auth_destroy_hmacs(struct crypto_hash *auth_hmacs[])
+void sctp_auth_destroy_hmacs(struct crypto_shash *auth_hmacs[])
 {
int i;
 
@@ -508,8 +506,7 @@ void sctp_auth_destroy_hmacs(struct crypto_hash 
*auth_hmacs[])
return;
 
for (i = 0; i < SCTP_AUTH_NUM_HMACS; i++) {
-   if (auth_hmacs[i])
-   crypto_free_hash(auth_hmacs[i]);
+   crypto_free_shash(auth_hmacs[i]);
}
kfree(auth_hmacs);
 }
@@ -709,8 +706,7 @@ void sctp_auth_calculate_hmac(const struct sctp_association 
*asoc,
  struct sctp_auth_chunk *auth,
  gfp_t gfp)
 {
-   struct scatterlist sg;
-   struct hash_desc desc;
+   struct crypto_shash *tfm;
struct sctp_auth_bytes *asoc_key;
__u16 key_id, hmac_id;
__u8 *digest;
@@ -742,16 +738,22 @@ void sctp_auth_calculate_hmac(const struct 
sctp_association *asoc,
 
/* set up scatter list */
 

[PATCH 24/26] nfsd: Use shash

2016-01-24 Thread Herbert Xu
This patch replaces uses of the long obsolete hash interface with
shash.

Signed-off-by: Herbert Xu 
---

 fs/nfsd/nfs4recover.c |   28 +---
 1 file changed, 17 insertions(+), 11 deletions(-)

diff --git a/fs/nfsd/nfs4recover.c b/fs/nfsd/nfs4recover.c
index 79f0307..a79c150 100644
--- a/fs/nfsd/nfs4recover.c
+++ b/fs/nfsd/nfs4recover.c
@@ -32,10 +32,10 @@
 *
 */
 
+#include 
 #include 
 #include 
 #include 
-#include 
 #include 
 #include 
 #include 
@@ -104,29 +104,35 @@ static int
 nfs4_make_rec_clidname(char *dname, const struct xdr_netobj *clname)
 {
struct xdr_netobj cksum;
-   struct hash_desc desc;
-   struct scatterlist sg;
+   struct crypto_shash *tfm;
int status;
 
dprintk("NFSD: nfs4_make_rec_clidname for %.*s\n",
clname->len, clname->data);
-   desc.flags = CRYPTO_TFM_REQ_MAY_SLEEP;
-   desc.tfm = crypto_alloc_hash("md5", 0, CRYPTO_ALG_ASYNC);
-   if (IS_ERR(desc.tfm)) {
-   status = PTR_ERR(desc.tfm);
+   tfm = crypto_alloc_shash("md5", 0, 0);
+   if (IS_ERR(tfm)) {
+   status = PTR_ERR(tfm);
goto out_no_tfm;
}
 
-   cksum.len = crypto_hash_digestsize(desc.tfm);
+   cksum.len = crypto_shash_digestsize(tfm);
cksum.data = kmalloc(cksum.len, GFP_KERNEL);
if (cksum.data == NULL) {
status = -ENOMEM;
goto out;
}
 
-   sg_init_one(&sg, clname->data, clname->len);
+   {
+   SHASH_DESC_ON_STACK(desc, tfm);
+
+   desc->tfm = tfm;
+   desc->flags = CRYPTO_TFM_REQ_MAY_SLEEP;
+
+   status = crypto_shash_digest(desc, clname->data, clname->len,
+cksum.data);
+   shash_desc_zero(desc);
+   }
 
-   status = crypto_hash_digest(&desc, &sg, sg.length, cksum.data);
if (status)
goto out;
 
@@ -135,7 +141,7 @@ nfs4_make_rec_clidname(char *dname, const struct xdr_netobj 
*clname)
status = 0;
 out:
kfree(cksum.data);
-   crypto_free_hash(desc.tfm);
+   crypto_free_shash(tfm);
 out_no_tfm:
return status;
 }
--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 10/26] ext4: Use skcipher

2016-01-24 Thread Herbert Xu
This patch replaces uses of ablkcipher with skcipher.
   
Signed-off-by: Herbert Xu 
---

 fs/ext4/crypto.c   |   24 +++-
 fs/ext4/crypto_fname.c |   32 +++-
 fs/ext4/crypto_key.c   |   42 --
 fs/ext4/ext4_crypto.h  |2 +-
 4 files changed, 47 insertions(+), 53 deletions(-)

diff --git a/fs/ext4/crypto.c b/fs/ext4/crypto.c
index 1a08350..a052c2a 100644
--- a/fs/ext4/crypto.c
+++ b/fs/ext4/crypto.c
@@ -18,11 +18,9 @@
  * Special Publication 800-38E and IEEE P1619/D16.
  */
 
-#include 
-#include 
+#include 
 #include 
 #include 
-#include 
 #include 
 #include 
 #include 
@@ -261,21 +259,21 @@ static int ext4_page_crypto(struct inode *inode,
 
 {
u8 xts_tweak[EXT4_XTS_TWEAK_SIZE];
-   struct ablkcipher_request *req = NULL;
+   struct skcipher_request *req = NULL;
DECLARE_EXT4_COMPLETION_RESULT(ecr);
struct scatterlist dst, src;
struct ext4_crypt_info *ci = EXT4_I(inode)->i_crypt_info;
-   struct crypto_ablkcipher *tfm = ci->ci_ctfm;
+   struct crypto_skcipher *tfm = ci->ci_ctfm;
int res = 0;
 
-   req = ablkcipher_request_alloc(tfm, GFP_NOFS);
+   req = skcipher_request_alloc(tfm, GFP_NOFS);
if (!req) {
printk_ratelimited(KERN_ERR
   "%s: crypto_request_alloc() failed\n",
   __func__);
return -ENOMEM;
}
-   ablkcipher_request_set_callback(
+   skcipher_request_set_callback(
req, CRYPTO_TFM_REQ_MAY_BACKLOG | CRYPTO_TFM_REQ_MAY_SLEEP,
ext4_crypt_complete, &ecr);
 
@@ -288,21 +286,21 @@ static int ext4_page_crypto(struct inode *inode,
sg_set_page(&dst, dest_page, PAGE_CACHE_SIZE, 0);
sg_init_table(&src, 1);
sg_set_page(&src, src_page, PAGE_CACHE_SIZE, 0);
-   ablkcipher_request_set_crypt(req, &src, &dst, PAGE_CACHE_SIZE,
-xts_tweak);
+   skcipher_request_set_crypt(req, &src, &dst, PAGE_CACHE_SIZE,
+  xts_tweak);
if (rw == EXT4_DECRYPT)
-   res = crypto_ablkcipher_decrypt(req);
+   res = crypto_skcipher_decrypt(req);
else
-   res = crypto_ablkcipher_encrypt(req);
+   res = crypto_skcipher_encrypt(req);
if (res == -EINPROGRESS || res == -EBUSY) {
wait_for_completion(&ecr.completion);
res = ecr.res;
}
-   ablkcipher_request_free(req);
+   skcipher_request_free(req);
if (res) {
printk_ratelimited(
KERN_ERR
-   "%s: crypto_ablkcipher_encrypt() returned %d\n",
+   "%s: crypto_skcipher_encrypt() returned %d\n",
__func__, res);
return res;
}
diff --git a/fs/ext4/crypto_fname.c b/fs/ext4/crypto_fname.c
index 2fbef8a..1a2f360 100644
--- a/fs/ext4/crypto_fname.c
+++ b/fs/ext4/crypto_fname.c
@@ -11,11 +11,9 @@
  *
  */
 
-#include 
-#include 
+#include 
 #include 
 #include 
-#include 
 #include 
 #include 
 #include 
@@ -65,10 +63,10 @@ static int ext4_fname_encrypt(struct inode *inode,
  struct ext4_str *oname)
 {
u32 ciphertext_len;
-   struct ablkcipher_request *req = NULL;
+   struct skcipher_request *req = NULL;
DECLARE_EXT4_COMPLETION_RESULT(ecr);
struct ext4_crypt_info *ci = EXT4_I(inode)->i_crypt_info;
-   struct crypto_ablkcipher *tfm = ci->ci_ctfm;
+   struct crypto_skcipher *tfm = ci->ci_ctfm;
int res = 0;
char iv[EXT4_CRYPTO_BLOCK_SIZE];
struct scatterlist src_sg, dst_sg;
@@ -95,14 +93,14 @@ static int ext4_fname_encrypt(struct inode *inode,
}
 
/* Allocate request */
-   req = ablkcipher_request_alloc(tfm, GFP_NOFS);
+   req = skcipher_request_alloc(tfm, GFP_NOFS);
if (!req) {
printk_ratelimited(
KERN_ERR "%s: crypto_request_alloc() failed\n", __func__);
kfree(alloc_buf);
return -ENOMEM;
}
-   ablkcipher_request_set_callback(req,
+   skcipher_request_set_callback(req,
CRYPTO_TFM_REQ_MAY_BACKLOG | CRYPTO_TFM_REQ_MAY_SLEEP,
ext4_dir_crypt_complete, &ecr);
 
@@ -117,14 +115,14 @@ static int ext4_fname_encrypt(struct inode *inode,
/* Create encryption request */
sg_init_one(&src_sg, workbuf, ciphertext_len);
sg_init_one(&dst_sg, oname->name, ciphertext_len);
-   ablkcipher_request_set_crypt(req, &src_sg, &dst_sg, ciphertext_len, iv);
-   res = crypto_ablkcipher_encrypt(req);
+   skcipher_request_set_crypt(req, &src_sg, &dst_sg, ciphertext_len, iv);
+   res = crypto_skcipher_encrypt(req);
if (res == -EINPROGRESS || res == -EBUSY) {
wait_for_completion(&ecr.comp

[PATCH 8/26] cifs: Use skcipher

2016-01-24 Thread Herbert Xu
This patch replaces uses of blkcipher with skcipher.

Signed-off-by: Herbert Xu 
---

 fs/cifs/cifsencrypt.c |   32 +---
 fs/cifs/smbencrypt.c  |   26 +++---
 2 files changed, 40 insertions(+), 18 deletions(-)

diff --git a/fs/cifs/cifsencrypt.c b/fs/cifs/cifsencrypt.c
index afa09fc..d411654 100644
--- a/fs/cifs/cifsencrypt.c
+++ b/fs/cifs/cifsencrypt.c
@@ -33,6 +33,7 @@
 #include 
 #include 
 #include 
+#include 
 
 static int
 cifs_crypto_shash_md5_allocate(struct TCP_Server_Info *server)
@@ -789,38 +790,46 @@ int
 calc_seckey(struct cifs_ses *ses)
 {
int rc;
-   struct crypto_blkcipher *tfm_arc4;
+   struct crypto_skcipher *tfm_arc4;
struct scatterlist sgin, sgout;
-   struct blkcipher_desc desc;
+   struct skcipher_request *req;
unsigned char sec_key[CIFS_SESS_KEY_SIZE]; /* a nonce */
 
get_random_bytes(sec_key, CIFS_SESS_KEY_SIZE);
 
-   tfm_arc4 = crypto_alloc_blkcipher("ecb(arc4)", 0, CRYPTO_ALG_ASYNC);
+   tfm_arc4 = crypto_alloc_skcipher("ecb(arc4)", 0, CRYPTO_ALG_ASYNC);
if (IS_ERR(tfm_arc4)) {
rc = PTR_ERR(tfm_arc4);
cifs_dbg(VFS, "could not allocate crypto API arc4\n");
return rc;
}
 
-   desc.tfm = tfm_arc4;
-
-   rc = crypto_blkcipher_setkey(tfm_arc4, ses->auth_key.response,
+   rc = crypto_skcipher_setkey(tfm_arc4, ses->auth_key.response,
CIFS_SESS_KEY_SIZE);
if (rc) {
cifs_dbg(VFS, "%s: Could not set response as a key\n",
 __func__);
-   return rc;
+   goto out_free_cipher;
+   }
+
+   req = skcipher_request_alloc(tfm_arc4, GFP_KERNEL);
+   if (!req) {
+   rc = -ENOMEM;
+   cifs_dbg(VFS, "could not allocate crypto API arc4 request\n");
+   goto out_free_cipher;
}
 
sg_init_one(&sgin, sec_key, CIFS_SESS_KEY_SIZE);
sg_init_one(&sgout, ses->ntlmssp->ciphertext, CIFS_CPHTXT_SIZE);
 
-   rc = crypto_blkcipher_encrypt(&desc, &sgout, &sgin, CIFS_CPHTXT_SIZE);
+   skcipher_request_set_callback(req, 0, NULL, NULL);
+   skcipher_request_set_crypt(req, &sgin, &sgout, CIFS_CPHTXT_SIZE, NULL);
+
+   rc = crypto_skcipher_encrypt(req);
+   skcipher_request_free(req);
if (rc) {
cifs_dbg(VFS, "could not encrypt session key rc: %d\n", rc);
-   crypto_free_blkcipher(tfm_arc4);
-   return rc;
+   goto out_free_cipher;
}
 
/* make secondary_key/nonce as session key */
@@ -828,7 +837,8 @@ calc_seckey(struct cifs_ses *ses)
/* and make len as that of session key only */
ses->auth_key.len = CIFS_SESS_KEY_SIZE;
 
-   crypto_free_blkcipher(tfm_arc4);
+out_free_cipher:
+   crypto_free_skcipher(tfm_arc4);
 
return rc;
 }
diff --git a/fs/cifs/smbencrypt.c b/fs/cifs/smbencrypt.c
index a4232ec..699b786 100644
--- a/fs/cifs/smbencrypt.c
+++ b/fs/cifs/smbencrypt.c
@@ -23,6 +23,7 @@
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 */
 
+#include 
 #include 
 #include 
 #include 
@@ -70,31 +71,42 @@ smbhash(unsigned char *out, const unsigned char *in, 
unsigned char *key)
 {
int rc;
unsigned char key2[8];
-   struct crypto_blkcipher *tfm_des;
+   struct crypto_skcipher *tfm_des;
struct scatterlist sgin, sgout;
-   struct blkcipher_desc desc;
+   struct skcipher_request *req;
 
str_to_key(key, key2);
 
-   tfm_des = crypto_alloc_blkcipher("ecb(des)", 0, CRYPTO_ALG_ASYNC);
+   tfm_des = crypto_alloc_skcipher("ecb(des)", 0, CRYPTO_ALG_ASYNC);
if (IS_ERR(tfm_des)) {
rc = PTR_ERR(tfm_des);
cifs_dbg(VFS, "could not allocate des crypto API\n");
goto smbhash_err;
}
 
-   desc.tfm = tfm_des;
+   req = skcipher_request_alloc(tfm_des, GFP_KERNEL);
+   if (!req) {
+   rc = -ENOMEM;
+   cifs_dbg(VFS, "could not allocate des crypto API\n");
+   goto smbhash_free_skcipher;
+   }
 
-   crypto_blkcipher_setkey(tfm_des, key2, 8);
+   crypto_skcipher_setkey(tfm_des, key2, 8);
 
sg_init_one(&sgin, in, 8);
sg_init_one(&sgout, out, 8);
 
-   rc = crypto_blkcipher_encrypt(&desc, &sgout, &sgin, 8);
+   skcipher_request_set_callback(req, 0, NULL, NULL);
+   skcipher_request_set_crypt(req, &sgin, &sgout, 8, NULL);
+
+   rc = crypto_skcipher_encrypt(req);
if (rc)
cifs_dbg(VFS, "could not encrypt crypt key rc: %d\n", rc);
 
-   crypto_free_blkcipher(tfm_des);
+   skcipher_request_free(req);
+
+smbhash_free_skcipher:
+   crypto_free_skcipher(tfm_des);
 smbhash_err:
return rc;
 }
--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majord...@vger.kernel

[PATCH 16/26] libceph: Use skcipher

2016-01-24 Thread Herbert Xu
This patch replaces uses of blkcipher with skcipher.
   
Signed-off-by: Herbert Xu 
---

 net/ceph/crypto.c |   97 +++---
 1 file changed, 56 insertions(+), 41 deletions(-)

diff --git a/net/ceph/crypto.c b/net/ceph/crypto.c
index 42e8649..fb9cb2b 100644
--- a/net/ceph/crypto.c
+++ b/net/ceph/crypto.c
@@ -4,7 +4,8 @@
 #include 
 #include 
 #include 
-#include 
+#include 
+#include 
 #include 
 
 #include 
@@ -79,9 +80,9 @@ int ceph_crypto_key_unarmor(struct ceph_crypto_key *key, 
const char *inkey)
return 0;
 }
 
-static struct crypto_blkcipher *ceph_crypto_alloc_cipher(void)
+static struct crypto_skcipher *ceph_crypto_alloc_cipher(void)
 {
-   return crypto_alloc_blkcipher("cbc(aes)", 0, CRYPTO_ALG_ASYNC);
+   return crypto_alloc_skcipher("cbc(aes)", 0, CRYPTO_ALG_ASYNC);
 }
 
 static const u8 *aes_iv = (u8 *)CEPH_AES_IV;
@@ -162,11 +163,11 @@ static int ceph_aes_encrypt(const void *key, int key_len,
 {
struct scatterlist sg_in[2], prealloc_sg;
struct sg_table sg_out;
-   struct crypto_blkcipher *tfm = ceph_crypto_alloc_cipher();
-   struct blkcipher_desc desc = { .tfm = tfm, .flags = 0 };
+   struct crypto_skcipher *tfm = ceph_crypto_alloc_cipher();
+   SKCIPHER_REQUEST_ON_STACK(req, tfm);
int ret;
-   void *iv;
-   int ivsize;
+   int ivsize = AES_BLOCK_SIZE;
+   char iv[ivsize];
size_t zero_padding = (0x10 - (src_len & 0x0f));
char pad[16];
 
@@ -184,11 +185,14 @@ static int ceph_aes_encrypt(const void *key, int key_len,
if (ret)
goto out_tfm;
 
-   crypto_blkcipher_setkey((void *)tfm, key, key_len);
-   iv = crypto_blkcipher_crt(tfm)->iv;
-   ivsize = crypto_blkcipher_ivsize(tfm);
+   crypto_skcipher_setkey((void *)tfm, key, key_len);
memcpy(iv, aes_iv, ivsize);
 
+   skcipher_request_set_tfm(req, tfm);
+   skcipher_request_set_callback(req, 0, NULL, NULL);
+   skcipher_request_set_crypt(req, sg_in, sg_out.sgl,
+  src_len + zero_padding, iv);
+
/*
print_hex_dump(KERN_ERR, "enc key: ", DUMP_PREFIX_NONE, 16, 1,
   key, key_len, 1);
@@ -197,8 +201,8 @@ static int ceph_aes_encrypt(const void *key, int key_len,
print_hex_dump(KERN_ERR, "enc pad: ", DUMP_PREFIX_NONE, 16, 1,
pad, zero_padding, 1);
*/
-   ret = crypto_blkcipher_encrypt(&desc, sg_out.sgl, sg_in,
-src_len + zero_padding);
+   ret = crypto_skcipher_encrypt(req);
+   skcipher_request_zero(req);
if (ret < 0) {
pr_err("ceph_aes_crypt failed %d\n", ret);
goto out_sg;
@@ -211,7 +215,7 @@ static int ceph_aes_encrypt(const void *key, int key_len,
 out_sg:
teardown_sgtable(&sg_out);
 out_tfm:
-   crypto_free_blkcipher(tfm);
+   crypto_free_skcipher(tfm);
return ret;
 }
 
@@ -222,11 +226,11 @@ static int ceph_aes_encrypt2(const void *key, int 
key_len, void *dst,
 {
struct scatterlist sg_in[3], prealloc_sg;
struct sg_table sg_out;
-   struct crypto_blkcipher *tfm = ceph_crypto_alloc_cipher();
-   struct blkcipher_desc desc = { .tfm = tfm, .flags = 0 };
+   struct crypto_skcipher *tfm = ceph_crypto_alloc_cipher();
+   SKCIPHER_REQUEST_ON_STACK(req, tfm);
int ret;
-   void *iv;
-   int ivsize;
+   int ivsize = AES_BLOCK_SIZE;
+   char iv[ivsize];
size_t zero_padding = (0x10 - ((src1_len + src2_len) & 0x0f));
char pad[16];
 
@@ -245,11 +249,14 @@ static int ceph_aes_encrypt2(const void *key, int 
key_len, void *dst,
if (ret)
goto out_tfm;
 
-   crypto_blkcipher_setkey((void *)tfm, key, key_len);
-   iv = crypto_blkcipher_crt(tfm)->iv;
-   ivsize = crypto_blkcipher_ivsize(tfm);
+   crypto_skcipher_setkey((void *)tfm, key, key_len);
memcpy(iv, aes_iv, ivsize);
 
+   skcipher_request_set_tfm(req, tfm);
+   skcipher_request_set_callback(req, 0, NULL, NULL);
+   skcipher_request_set_crypt(req, sg_in, sg_out.sgl,
+  src1_len + src2_len + zero_padding, iv);
+
/*
print_hex_dump(KERN_ERR, "enc  key: ", DUMP_PREFIX_NONE, 16, 1,
   key, key_len, 1);
@@ -260,8 +267,8 @@ static int ceph_aes_encrypt2(const void *key, int key_len, 
void *dst,
print_hex_dump(KERN_ERR, "enc  pad: ", DUMP_PREFIX_NONE, 16, 1,
pad, zero_padding, 1);
*/
-   ret = crypto_blkcipher_encrypt(&desc, sg_out.sgl, sg_in,
-src1_len + src2_len + zero_padding);
+   ret = crypto_skcipher_encrypt(req);
+   skcipher_request_zero(req);
if (ret < 0) {
pr_err("ceph_aes_crypt2 failed %d\n", ret);
goto out_sg;
@@ -274,7 +281,7 @@ static int ceph_aes_encrypt2(const void *key, int key_

[PATCH 20/26] drbd: Use shash and ahash

2016-01-24 Thread Herbert Xu
This patch replaces uses of the long obsolete hash interface with
either shash (for non-SG users) or ahash.

Signed-off-by: Herbert Xu 
---

 drivers/block/drbd/drbd_int.h  |   16 +-
 drivers/block/drbd/drbd_main.c |   16 +-
 drivers/block/drbd/drbd_nl.c   |   59 +++--
 drivers/block/drbd/drbd_receiver.c |   56 ---
 drivers/block/drbd/drbd_worker.c   |   43 +++---
 5 files changed, 103 insertions(+), 87 deletions(-)

diff --git a/drivers/block/drbd/drbd_int.h b/drivers/block/drbd/drbd_int.h
index e66d453..686d955 100644
--- a/drivers/block/drbd/drbd_int.h
+++ b/drivers/block/drbd/drbd_int.h
@@ -26,13 +26,13 @@
 #ifndef _DRBD_INT_H
 #define _DRBD_INT_H
 
+#include 
 #include 
 #include 
 #include 
 #include 
 #include 
 #include 
-#include 
 #include 
 #include 
 #include 
@@ -737,11 +737,11 @@ struct drbd_connection {
 
struct list_head transfer_log;  /* all requests not yet fully processed 
*/
 
-   struct crypto_hash *cram_hmac_tfm;
-   struct crypto_hash *integrity_tfm;  /* checksums we compute, updates 
protected by connection->data->mutex */
-   struct crypto_hash *peer_integrity_tfm;  /* checksums we verify, only 
accessed from receiver thread  */
-   struct crypto_hash *csums_tfm;
-   struct crypto_hash *verify_tfm;
+   struct crypto_shash *cram_hmac_tfm;
+   struct crypto_ahash *integrity_tfm;  /* checksums we compute, updates 
protected by connection->data->mutex */
+   struct crypto_ahash *peer_integrity_tfm;  /* checksums we verify, only 
accessed from receiver thread  */
+   struct crypto_ahash *csums_tfm;
+   struct crypto_ahash *verify_tfm;
void *int_dig_in;
void *int_dig_vv;
 
@@ -1511,8 +1511,8 @@ static inline void ov_out_of_sync_print(struct 
drbd_device *device)
 }
 
 
-extern void drbd_csum_bio(struct crypto_hash *, struct bio *, void *);
-extern void drbd_csum_ee(struct crypto_hash *, struct drbd_peer_request *, 
void *);
+extern void drbd_csum_bio(struct crypto_ahash *, struct bio *, void *);
+extern void drbd_csum_ee(struct crypto_ahash *, struct drbd_peer_request *, 
void *);
 /* worker callbacks */
 extern int w_e_end_data_req(struct drbd_work *, int);
 extern int w_e_end_rsdata_req(struct drbd_work *, int);
diff --git a/drivers/block/drbd/drbd_main.c b/drivers/block/drbd/drbd_main.c
index 74d97f4..69ee808 100644
--- a/drivers/block/drbd/drbd_main.c
+++ b/drivers/block/drbd/drbd_main.c
@@ -1339,7 +1339,7 @@ void drbd_send_ack_dp(struct drbd_peer_device 
*peer_device, enum drbd_packet cmd
  struct p_data *dp, int data_size)
 {
if (peer_device->connection->peer_integrity_tfm)
-   data_size -= 
crypto_hash_digestsize(peer_device->connection->peer_integrity_tfm);
+   data_size -= 
crypto_ahash_digestsize(peer_device->connection->peer_integrity_tfm);
_drbd_send_ack(peer_device, cmd, dp->sector, cpu_to_be32(data_size),
   dp->block_id);
 }
@@ -1628,7 +1628,7 @@ int drbd_send_dblock(struct drbd_peer_device 
*peer_device, struct drbd_request *
sock = &peer_device->connection->data;
p = drbd_prepare_command(peer_device, sock);
digest_size = peer_device->connection->integrity_tfm ?
- 
crypto_hash_digestsize(peer_device->connection->integrity_tfm) : 0;
+ 
crypto_ahash_digestsize(peer_device->connection->integrity_tfm) : 0;
 
if (!p)
return -EIO;
@@ -1717,7 +1717,7 @@ int drbd_send_block(struct drbd_peer_device *peer_device, 
enum drbd_packet cmd,
p = drbd_prepare_command(peer_device, sock);
 
digest_size = peer_device->connection->integrity_tfm ?
- 
crypto_hash_digestsize(peer_device->connection->integrity_tfm) : 0;
+ 
crypto_ahash_digestsize(peer_device->connection->integrity_tfm) : 0;
 
if (!p)
return -EIO;
@@ -2506,11 +2506,11 @@ void conn_free_crypto(struct drbd_connection 
*connection)
 {
drbd_free_sock(connection);
 
-   crypto_free_hash(connection->csums_tfm);
-   crypto_free_hash(connection->verify_tfm);
-   crypto_free_hash(connection->cram_hmac_tfm);
-   crypto_free_hash(connection->integrity_tfm);
-   crypto_free_hash(connection->peer_integrity_tfm);
+   crypto_free_ahash(connection->csums_tfm);
+   crypto_free_ahash(connection->verify_tfm);
+   crypto_free_shash(connection->cram_hmac_tfm);
+   crypto_free_ahash(connection->integrity_tfm);
+   crypto_free_ahash(connection->peer_integrity_tfm);
kfree(connection->int_dig_in);
kfree(connection->int_dig_vv);
 
diff --git a/drivers/block/drbd/drbd_nl.c b/drivers/block/drbd/drbd_nl.c
index e80cbef..578f635 100644
--- a/drivers/block/drbd/drbd_nl.c
+++ b/drivers/block/drbd/drbd_nl.c
@@ -2065,19 +2065,34 @@ check_net_options(struct drbd_connection *connection, 

[PATCH 9/26] eCryptfs: Use skcipher and shash

2016-01-24 Thread Herbert Xu
This patch replaces uses of ablkcipher and blkcipher with skcipher,
and the long obsolete hash interface with shash.
   
Signed-off-by: Herbert Xu 
---

 fs/ecryptfs/crypto.c  |  107 +---
 fs/ecryptfs/ecryptfs_kernel.h |   12 +-
 fs/ecryptfs/inode.c   |1 
 fs/ecryptfs/keystore.c|  217 --
 fs/ecryptfs/main.c|1 
 fs/ecryptfs/mmap.c|1 
 fs/ecryptfs/super.c   |1 
 7 files changed, 179 insertions(+), 161 deletions(-)

diff --git a/fs/ecryptfs/crypto.c b/fs/ecryptfs/crypto.c
index 80d6901..11255cb 100644
--- a/fs/ecryptfs/crypto.c
+++ b/fs/ecryptfs/crypto.c
@@ -23,6 +23,8 @@
  * 02111-1307, USA.
  */
 
+#include 
+#include 
 #include 
 #include 
 #include 
@@ -30,7 +32,6 @@
 #include 
 #include 
 #include 
-#include 
 #include 
 #include 
 #include 
@@ -74,6 +75,19 @@ void ecryptfs_from_hex(char *dst, char *src, int dst_size)
}
 }
 
+static int ecryptfs_hash_digest(struct crypto_shash *tfm,
+   char *src, int len, char *dst)
+{
+   SHASH_DESC_ON_STACK(desc, tfm);
+   int err;
+
+   desc->tfm = tfm;
+   desc->flags = CRYPTO_TFM_REQ_MAY_SLEEP;
+   err = crypto_shash_digest(desc, src, len, dst);
+   shash_desc_zero(desc);
+   return err;
+}
+
 /**
  * ecryptfs_calculate_md5 - calculates the md5 of @src
  * @dst: Pointer to 16 bytes of allocated memory
@@ -88,45 +102,26 @@ static int ecryptfs_calculate_md5(char *dst,
  struct ecryptfs_crypt_stat *crypt_stat,
  char *src, int len)
 {
-   struct scatterlist sg;
-   struct hash_desc desc = {
-   .tfm = crypt_stat->hash_tfm,
-   .flags = CRYPTO_TFM_REQ_MAY_SLEEP
-   };
+   struct crypto_shash *tfm;
int rc = 0;
 
mutex_lock(&crypt_stat->cs_hash_tfm_mutex);
-   sg_init_one(&sg, (u8 *)src, len);
-   if (!desc.tfm) {
-   desc.tfm = crypto_alloc_hash(ECRYPTFS_DEFAULT_HASH, 0,
-CRYPTO_ALG_ASYNC);
-   if (IS_ERR(desc.tfm)) {
-   rc = PTR_ERR(desc.tfm);
+   tfm = crypt_stat->hash_tfm;
+   if (!tfm) {
+   tfm = crypto_alloc_shash(ECRYPTFS_DEFAULT_HASH, 0, 0);
+   if (IS_ERR(tfm)) {
+   rc = PTR_ERR(tfm);
ecryptfs_printk(KERN_ERR, "Error attempting to "
"allocate crypto context; rc = [%d]\n",
rc);
goto out;
}
-   crypt_stat->hash_tfm = desc.tfm;
-   }
-   rc = crypto_hash_init(&desc);
-   if (rc) {
-   printk(KERN_ERR
-  "%s: Error initializing crypto hash; rc = [%d]\n",
-  __func__, rc);
-   goto out;
+   crypt_stat->hash_tfm = tfm;
}
-   rc = crypto_hash_update(&desc, &sg, len);
+   rc = ecryptfs_hash_digest(tfm, src, len, dst);
if (rc) {
printk(KERN_ERR
-  "%s: Error updating crypto hash; rc = [%d]\n",
-  __func__, rc);
-   goto out;
-   }
-   rc = crypto_hash_final(&desc, dst);
-   if (rc) {
-   printk(KERN_ERR
-  "%s: Error finalizing crypto hash; rc = [%d]\n",
+  "%s: Error computing crypto hash; rc = [%d]\n",
   __func__, rc);
goto out;
}
@@ -234,10 +229,8 @@ void ecryptfs_destroy_crypt_stat(struct 
ecryptfs_crypt_stat *crypt_stat)
 {
struct ecryptfs_key_sig *key_sig, *key_sig_tmp;
 
-   if (crypt_stat->tfm)
-   crypto_free_ablkcipher(crypt_stat->tfm);
-   if (crypt_stat->hash_tfm)
-   crypto_free_hash(crypt_stat->hash_tfm);
+   crypto_free_skcipher(crypt_stat->tfm);
+   crypto_free_shash(crypt_stat->hash_tfm);
list_for_each_entry_safe(key_sig, key_sig_tmp,
 &crypt_stat->keysig_list, crypt_stat_list) {
list_del(&key_sig->crypt_stat_list);
@@ -342,7 +335,7 @@ static int crypt_scatterlist(struct ecryptfs_crypt_stat 
*crypt_stat,
 struct scatterlist *src_sg, int size,
 unsigned char *iv, int op)
 {
-   struct ablkcipher_request *req = NULL;
+   struct skcipher_request *req = NULL;
struct extent_crypt_result ecr;
int rc = 0;
 
@@ -358,20 +351,20 @@ static int crypt_scatterlist(struct ecryptfs_crypt_stat 
*crypt_stat,
init_completion(&ecr.completion);
 
mutex_lock(&crypt_stat->cs_tfm_mutex);
-   req = ablkcipher_request_alloc(crypt_stat->tfm, GFP_NOFS);
+   req = skcipher_request_alloc(crypt_stat->tfm, GFP_NOFS);
if (!req) {
mutex_unlock(&crypt_stat->cs_tfm_mutex)

[PATCH 12/26] sunrpc: Use skcipher and ahash/shash

2016-01-24 Thread Herbert Xu
This patch replaces uses of blkcipher with skcipher and the long
obsolete hash interface with either shash (for non-SG users) and
ahash.
   
Signed-off-by: Herbert Xu 
---

 include/linux/sunrpc/gss_krb5.h   |   32 +--
 net/sunrpc/auth_gss/gss_krb5_crypto.c |  350 --
 net/sunrpc/auth_gss/gss_krb5_keys.c   |   12 -
 net/sunrpc/auth_gss/gss_krb5_mech.c   |   89 
 net/sunrpc/auth_gss/gss_krb5_seqnum.c |   22 +-
 net/sunrpc/auth_gss/gss_krb5_wrap.c   |   24 +-
 6 files changed, 306 insertions(+), 223 deletions(-)

diff --git a/include/linux/sunrpc/gss_krb5.h b/include/linux/sunrpc/gss_krb5.h
index df02a41..7df625d 100644
--- a/include/linux/sunrpc/gss_krb5.h
+++ b/include/linux/sunrpc/gss_krb5.h
@@ -36,7 +36,7 @@
  *
  */
 
-#include 
+#include 
 #include 
 #include 
 #include 
@@ -71,10 +71,10 @@ struct gss_krb5_enctype {
const u32   keyed_cksum;/* is it a keyed cksum? */
const u32   keybytes;   /* raw key len, in bytes */
const u32   keylength;  /* final key len, in bytes */
-   u32 (*encrypt) (struct crypto_blkcipher *tfm,
+   u32 (*encrypt) (struct crypto_skcipher *tfm,
void *iv, void *in, void *out,
int length);/* encryption function */
-   u32 (*decrypt) (struct crypto_blkcipher *tfm,
+   u32 (*decrypt) (struct crypto_skcipher *tfm,
void *iv, void *in, void *out,
int length);/* decryption function */
u32 (*mk_key) (const struct gss_krb5_enctype *gk5e,
@@ -98,12 +98,12 @@ struct krb5_ctx {
u32 enctype;
u32 flags;
const struct gss_krb5_enctype *gk5e; /* enctype-specific info */
-   struct crypto_blkcipher *enc;
-   struct crypto_blkcipher *seq;
-   struct crypto_blkcipher *acceptor_enc;
-   struct crypto_blkcipher *initiator_enc;
-   struct crypto_blkcipher *acceptor_enc_aux;
-   struct crypto_blkcipher *initiator_enc_aux;
+   struct crypto_skcipher  *enc;
+   struct crypto_skcipher  *seq;
+   struct crypto_skcipher *acceptor_enc;
+   struct crypto_skcipher *initiator_enc;
+   struct crypto_skcipher *acceptor_enc_aux;
+   struct crypto_skcipher *initiator_enc_aux;
u8  Ksess[GSS_KRB5_MAX_KEYLEN]; /* session key */
u8  cksum[GSS_KRB5_MAX_KEYLEN];
s32 endtime;
@@ -262,24 +262,24 @@ gss_unwrap_kerberos(struct gss_ctx *ctx_id, int offset,
 
 
 u32
-krb5_encrypt(struct crypto_blkcipher *key,
+krb5_encrypt(struct crypto_skcipher *key,
 void *iv, void *in, void *out, int length);
 
 u32
-krb5_decrypt(struct crypto_blkcipher *key,
+krb5_decrypt(struct crypto_skcipher *key,
 void *iv, void *in, void *out, int length); 
 
 int
-gss_encrypt_xdr_buf(struct crypto_blkcipher *tfm, struct xdr_buf *outbuf,
+gss_encrypt_xdr_buf(struct crypto_skcipher *tfm, struct xdr_buf *outbuf,
int offset, struct page **pages);
 
 int
-gss_decrypt_xdr_buf(struct crypto_blkcipher *tfm, struct xdr_buf *inbuf,
+gss_decrypt_xdr_buf(struct crypto_skcipher *tfm, struct xdr_buf *inbuf,
int offset);
 
 s32
 krb5_make_seq_num(struct krb5_ctx *kctx,
-   struct crypto_blkcipher *key,
+   struct crypto_skcipher *key,
int direction,
u32 seqnum, unsigned char *cksum, unsigned char *buf);
 
@@ -320,12 +320,12 @@ gss_krb5_aes_decrypt(struct krb5_ctx *kctx, u32 offset,
 
 int
 krb5_rc4_setup_seq_key(struct krb5_ctx *kctx,
-  struct crypto_blkcipher *cipher,
+  struct crypto_skcipher *cipher,
   unsigned char *cksum);
 
 int
 krb5_rc4_setup_enc_key(struct krb5_ctx *kctx,
-  struct crypto_blkcipher *cipher,
+  struct crypto_skcipher *cipher,
   s32 seqnum);
 void
 gss_krb5_make_confounder(char *p, u32 conflen);
diff --git a/net/sunrpc/auth_gss/gss_krb5_crypto.c 
b/net/sunrpc/auth_gss/gss_krb5_crypto.c
index fee3c15..d94a8e1 100644
--- a/net/sunrpc/auth_gss/gss_krb5_crypto.c
+++ b/net/sunrpc/auth_gss/gss_krb5_crypto.c
@@ -34,11 +34,12 @@
  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  */
 
+#include 
+#include 
 #include 
 #include 
 #include 
 #include 
-#include 
 #include 
 #include 
 #include 
@@ -51,7 +52,7 @@
 
 u32
 krb5_encrypt(
-   struct crypto_blkcipher *tfm,
+   struct crypto_skcipher *tfm,
void * iv,
void * in,
void * out,
@@ -60,24 +61,28 @@ krb5_encrypt(
u32 ret = -EINVAL;
struct scatterlist sg[1];
u8 local_iv[GSS_KRB5_MAX_BLOCKSIZE] = {0};
-   struct blkcipher_desc desc = { .tfm = tfm, .info = local_iv };
+   SKCIPHER_REQUEST_ON_STACK(req, tfm);
 
-   if (length % cry

[PATCH 19/26] ipsec: Use skcipher and ahash when probing algorithms

2016-01-24 Thread Herbert Xu
This patch removes the last reference to hash and ablkcipher from
IPsec and replaces them with ahash and skcipher respectively.  For
skcipher there is currently no difference at all, while for ahash
the current code is actually buggy and would prevent asynchronous
algorithms from being discovered.

Signed-off-by: Herbert Xu 
---

 net/xfrm/xfrm_algo.c |7 ---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/net/xfrm/xfrm_algo.c b/net/xfrm/xfrm_algo.c
index f07224d..250e567 100644
--- a/net/xfrm/xfrm_algo.c
+++ b/net/xfrm/xfrm_algo.c
@@ -9,6 +9,8 @@
  * any later version.
  */
 
+#include 
+#include 
 #include 
 #include 
 #include 
@@ -782,14 +784,13 @@ void xfrm_probe_algs(void)
BUG_ON(in_softirq());
 
for (i = 0; i < aalg_entries(); i++) {
-   status = crypto_has_hash(aalg_list[i].name, 0,
-CRYPTO_ALG_ASYNC);
+   status = crypto_has_ahash(aalg_list[i].name, 0, 0);
if (aalg_list[i].available != status)
aalg_list[i].available = status;
}
 
for (i = 0; i < ealg_entries(); i++) {
-   status = crypto_has_ablkcipher(ealg_list[i].name, 0, 0);
+   status = crypto_has_skcipher(ealg_list[i].name, 0, 0);
if (ealg_list[i].available != status)
ealg_list[i].available = status;
}
--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 18/26] rxrpc: Use skcipher

2016-01-24 Thread Herbert Xu
This patch replaces uses of blkcipher with skcipher.
   
Signed-off-by: Herbert Xu 
---

 net/rxrpc/ar-internal.h |2 
 net/rxrpc/ar-key.c  |   12 +--
 net/rxrpc/rxkad.c   |  172 +---
 3 files changed, 114 insertions(+), 72 deletions(-)

diff --git a/net/rxrpc/ar-internal.h b/net/rxrpc/ar-internal.h
index 2934a73..71598f5 100644
--- a/net/rxrpc/ar-internal.h
+++ b/net/rxrpc/ar-internal.h
@@ -252,7 +252,7 @@ struct rxrpc_connection {
struct rxrpc_security   *security;  /* applied security module */
struct key  *key;   /* security for this connection 
(client) */
struct key  *server_key;/* security for this service */
-   struct crypto_blkcipher *cipher;/* encryption handle */
+   struct crypto_skcipher  *cipher;/* encryption handle */
struct rxrpc_crypt  csum_iv;/* packet checksum base */
unsigned long   events;
 #define RXRPC_CONN_CHALLENGE   0   /* send challenge packet */
diff --git a/net/rxrpc/ar-key.c b/net/rxrpc/ar-key.c
index 3f65716..3fb492e 100644
--- a/net/rxrpc/ar-key.c
+++ b/net/rxrpc/ar-key.c
@@ -12,11 +12,11 @@
  * "a...@cambridge.redhat.com>
  */
 
+#include 
 #include 
 #include 
 #include 
 #include 
-#include 
 #include 
 #include 
 #include 
@@ -824,7 +824,7 @@ static void rxrpc_free_preparse(struct 
key_preparsed_payload *prep)
  */
 static int rxrpc_preparse_s(struct key_preparsed_payload *prep)
 {
-   struct crypto_blkcipher *ci;
+   struct crypto_skcipher *ci;
 
_enter("%zu", prep->datalen);
 
@@ -833,13 +833,13 @@ static int rxrpc_preparse_s(struct key_preparsed_payload 
*prep)
 
memcpy(&prep->payload.data[2], prep->data, 8);
 
-   ci = crypto_alloc_blkcipher("pcbc(des)", 0, CRYPTO_ALG_ASYNC);
+   ci = crypto_alloc_skcipher("pcbc(des)", 0, CRYPTO_ALG_ASYNC);
if (IS_ERR(ci)) {
_leave(" = %ld", PTR_ERR(ci));
return PTR_ERR(ci);
}
 
-   if (crypto_blkcipher_setkey(ci, prep->data, 8) < 0)
+   if (crypto_skcipher_setkey(ci, prep->data, 8) < 0)
BUG();
 
prep->payload.data[0] = ci;
@@ -853,7 +853,7 @@ static int rxrpc_preparse_s(struct key_preparsed_payload 
*prep)
 static void rxrpc_free_preparse_s(struct key_preparsed_payload *prep)
 {
if (prep->payload.data[0])
-   crypto_free_blkcipher(prep->payload.data[0]);
+   crypto_free_skcipher(prep->payload.data[0]);
 }
 
 /*
@@ -870,7 +870,7 @@ static void rxrpc_destroy(struct key *key)
 static void rxrpc_destroy_s(struct key *key)
 {
if (key->payload.data[0]) {
-   crypto_free_blkcipher(key->payload.data[0]);
+   crypto_free_skcipher(key->payload.data[0]);
key->payload.data[0] = NULL;
}
 }
diff --git a/net/rxrpc/rxkad.c b/net/rxrpc/rxkad.c
index d7a9ab5..0d96b48 100644
--- a/net/rxrpc/rxkad.c
+++ b/net/rxrpc/rxkad.c
@@ -9,11 +9,11 @@
  * 2 of the License, or (at your option) any later version.
  */
 
+#include 
 #include 
 #include 
 #include 
 #include 
-#include 
 #include 
 #include 
 #include 
@@ -53,7 +53,7 @@ MODULE_LICENSE("GPL");
  * alloc routine, but since we have it to hand, we use it to decrypt RESPONSE
  * packets
  */
-static struct crypto_blkcipher *rxkad_ci;
+static struct crypto_skcipher *rxkad_ci;
 static DEFINE_MUTEX(rxkad_ci_mutex);
 
 /*
@@ -61,7 +61,7 @@ static DEFINE_MUTEX(rxkad_ci_mutex);
  */
 static int rxkad_init_connection_security(struct rxrpc_connection *conn)
 {
-   struct crypto_blkcipher *ci;
+   struct crypto_skcipher *ci;
struct rxrpc_key_token *token;
int ret;
 
@@ -70,15 +70,15 @@ static int rxkad_init_connection_security(struct 
rxrpc_connection *conn)
token = conn->key->payload.data[0];
conn->security_ix = token->security_index;
 
-   ci = crypto_alloc_blkcipher("pcbc(fcrypt)", 0, CRYPTO_ALG_ASYNC);
+   ci = crypto_alloc_skcipher("pcbc(fcrypt)", 0, CRYPTO_ALG_ASYNC);
if (IS_ERR(ci)) {
_debug("no cipher");
ret = PTR_ERR(ci);
goto error;
}
 
-   if (crypto_blkcipher_setkey(ci, token->kad->session_key,
-   sizeof(token->kad->session_key)) < 0)
+   if (crypto_skcipher_setkey(ci, token->kad->session_key,
+  sizeof(token->kad->session_key)) < 0)
BUG();
 
switch (conn->security_level) {
@@ -113,7 +113,7 @@ error:
 static void rxkad_prime_packet_security(struct rxrpc_connection *conn)
 {
struct rxrpc_key_token *token;
-   struct blkcipher_desc desc;
+   SKCIPHER_REQUEST_ON_STACK(req, conn->cipher);
struct scatterlist sg[2];
struct rxrpc_crypt iv;
struct {
@@ -128,10 +128,6 @@ static void rxkad_prime_packet_security(struct 
rxrpc_connection *conn)
token = conn->key->payload.da

[PATCH 13/26] lib80211: Use skcipher and ahash

2016-01-24 Thread Herbert Xu
This patch replaces uses of blkcipher with skcipher and the long
obsolete hash interface with ahash.
   
Signed-off-by: Herbert Xu 
---

 net/wireless/lib80211_crypt_tkip.c |   99 -
 net/wireless/lib80211_crypt_wep.c  |   46 ++---
 2 files changed, 81 insertions(+), 64 deletions(-)

diff --git a/net/wireless/lib80211_crypt_tkip.c 
b/net/wireless/lib80211_crypt_tkip.c
index 3cd8195..71447cf 100644
--- a/net/wireless/lib80211_crypt_tkip.c
+++ b/net/wireless/lib80211_crypt_tkip.c
@@ -29,7 +29,8 @@
 #include 
 #include 
 
-#include 
+#include 
+#include 
 #include 
 
 #include 
@@ -63,10 +64,10 @@ struct lib80211_tkip_data {
 
int key_idx;
 
-   struct crypto_blkcipher *rx_tfm_arc4;
-   struct crypto_hash *rx_tfm_michael;
-   struct crypto_blkcipher *tx_tfm_arc4;
-   struct crypto_hash *tx_tfm_michael;
+   struct crypto_skcipher *rx_tfm_arc4;
+   struct crypto_ahash *rx_tfm_michael;
+   struct crypto_skcipher *tx_tfm_arc4;
+   struct crypto_ahash *tx_tfm_michael;
 
/* scratch buffers for virt_to_page() (crypto API) */
u8 rx_hdr[16], tx_hdr[16];
@@ -98,29 +99,29 @@ static void *lib80211_tkip_init(int key_idx)
 
priv->key_idx = key_idx;
 
-   priv->tx_tfm_arc4 = crypto_alloc_blkcipher("ecb(arc4)", 0,
-   CRYPTO_ALG_ASYNC);
+   priv->tx_tfm_arc4 = crypto_alloc_skcipher("ecb(arc4)", 0,
+ CRYPTO_ALG_ASYNC);
if (IS_ERR(priv->tx_tfm_arc4)) {
priv->tx_tfm_arc4 = NULL;
goto fail;
}
 
-   priv->tx_tfm_michael = crypto_alloc_hash("michael_mic", 0,
-CRYPTO_ALG_ASYNC);
+   priv->tx_tfm_michael = crypto_alloc_ahash("michael_mic", 0,
+ CRYPTO_ALG_ASYNC);
if (IS_ERR(priv->tx_tfm_michael)) {
priv->tx_tfm_michael = NULL;
goto fail;
}
 
-   priv->rx_tfm_arc4 = crypto_alloc_blkcipher("ecb(arc4)", 0,
-   CRYPTO_ALG_ASYNC);
+   priv->rx_tfm_arc4 = crypto_alloc_skcipher("ecb(arc4)", 0,
+ CRYPTO_ALG_ASYNC);
if (IS_ERR(priv->rx_tfm_arc4)) {
priv->rx_tfm_arc4 = NULL;
goto fail;
}
 
-   priv->rx_tfm_michael = crypto_alloc_hash("michael_mic", 0,
-CRYPTO_ALG_ASYNC);
+   priv->rx_tfm_michael = crypto_alloc_ahash("michael_mic", 0,
+ CRYPTO_ALG_ASYNC);
if (IS_ERR(priv->rx_tfm_michael)) {
priv->rx_tfm_michael = NULL;
goto fail;
@@ -130,14 +131,10 @@ static void *lib80211_tkip_init(int key_idx)
 
   fail:
if (priv) {
-   if (priv->tx_tfm_michael)
-   crypto_free_hash(priv->tx_tfm_michael);
-   if (priv->tx_tfm_arc4)
-   crypto_free_blkcipher(priv->tx_tfm_arc4);
-   if (priv->rx_tfm_michael)
-   crypto_free_hash(priv->rx_tfm_michael);
-   if (priv->rx_tfm_arc4)
-   crypto_free_blkcipher(priv->rx_tfm_arc4);
+   crypto_free_ahash(priv->tx_tfm_michael);
+   crypto_free_skcipher(priv->tx_tfm_arc4);
+   crypto_free_ahash(priv->rx_tfm_michael);
+   crypto_free_skcipher(priv->rx_tfm_arc4);
kfree(priv);
}
 
@@ -148,14 +145,10 @@ static void lib80211_tkip_deinit(void *priv)
 {
struct lib80211_tkip_data *_priv = priv;
if (_priv) {
-   if (_priv->tx_tfm_michael)
-   crypto_free_hash(_priv->tx_tfm_michael);
-   if (_priv->tx_tfm_arc4)
-   crypto_free_blkcipher(_priv->tx_tfm_arc4);
-   if (_priv->rx_tfm_michael)
-   crypto_free_hash(_priv->rx_tfm_michael);
-   if (_priv->rx_tfm_arc4)
-   crypto_free_blkcipher(_priv->rx_tfm_arc4);
+   crypto_free_ahash(_priv->tx_tfm_michael);
+   crypto_free_skcipher(_priv->tx_tfm_arc4);
+   crypto_free_ahash(_priv->rx_tfm_michael);
+   crypto_free_skcipher(_priv->rx_tfm_arc4);
}
kfree(priv);
 }
@@ -353,11 +346,12 @@ static int lib80211_tkip_hdr(struct sk_buff *skb, int 
hdr_len,
 static int lib80211_tkip_encrypt(struct sk_buff *skb, int hdr_len, void *priv)
 {
struct lib80211_tkip_data *tkey = priv;
-   struct blkcipher_desc desc = { .tfm = tkey->tx_tfm_arc4 };
+   SKCIPHER_REQUEST_ON_STACK(req, tkey->tx_tfm_arc4);
int len;
u8 rc4key[16], *pos, *icv;
u32 crc;
struct scatterlist sg;
+   int err;
 
if (tkey->flags & IEEE80211_CRYPTO_TKIP_COUNTERMEASURES) {

[PATCH 23/26] iscsi-target: Use shash and ahash

2016-01-24 Thread Herbert Xu
This patch replaces uses of the long obsolete hash interface with
either shash (for non-SG users) or ahash.

Signed-off-by: Herbert Xu 
---

 drivers/target/iscsi/iscsi_target.c   |   86 ++
 drivers/target/iscsi/iscsi_target_auth.c  |   98 +++---
 drivers/target/iscsi/iscsi_target_login.c |   45 -
 include/target/iscsi/iscsi_target_core.h  |4 -
 4 files changed, 113 insertions(+), 120 deletions(-)

diff --git a/drivers/target/iscsi/iscsi_target.c 
b/drivers/target/iscsi/iscsi_target.c
index 72204fb..866f3ad 100644
--- a/drivers/target/iscsi/iscsi_target.c
+++ b/drivers/target/iscsi/iscsi_target.c
@@ -16,9 +16,9 @@
  * GNU General Public License for more details.
  
**/
 
+#include 
 #include 
 #include 
-#include 
 #include 
 #include 
 #include 
@@ -1190,7 +1190,7 @@ iscsit_handle_scsi_cmd(struct iscsi_conn *conn, struct 
iscsi_cmd *cmd,
 }
 
 static u32 iscsit_do_crypto_hash_sg(
-   struct hash_desc *hash,
+   struct ahash_request *hash,
struct iscsi_cmd *cmd,
u32 data_offset,
u32 data_length,
@@ -1201,7 +1201,7 @@ static u32 iscsit_do_crypto_hash_sg(
struct scatterlist *sg;
unsigned int page_off;
 
-   crypto_hash_init(hash);
+   crypto_ahash_init(hash);
 
sg = cmd->first_data_sg;
page_off = cmd->first_data_sg_off;
@@ -1209,7 +1209,8 @@ static u32 iscsit_do_crypto_hash_sg(
while (data_length) {
u32 cur_len = min_t(u32, data_length, (sg->length - page_off));
 
-   crypto_hash_update(hash, sg, cur_len);
+   ahash_request_set_crypt(hash, sg, NULL, cur_len);
+   crypto_ahash_update(hash);
 
data_length -= cur_len;
page_off = 0;
@@ -1221,33 +1222,34 @@ static u32 iscsit_do_crypto_hash_sg(
struct scatterlist pad_sg;
 
sg_init_one(&pad_sg, pad_bytes, padding);
-   crypto_hash_update(hash, &pad_sg, padding);
+   ahash_request_set_crypt(hash, &pad_sg, (u8 *)&data_crc,
+   padding);
+   crypto_ahash_finup(hash);
+   } else {
+   ahash_request_set_crypt(hash, NULL, (u8 *)&data_crc, 0);
+   crypto_ahash_final(hash);
}
-   crypto_hash_final(hash, (u8 *) &data_crc);
 
return data_crc;
 }
 
 static void iscsit_do_crypto_hash_buf(
-   struct hash_desc *hash,
+   struct ahash_request *hash,
const void *buf,
u32 payload_length,
u32 padding,
u8 *pad_bytes,
u8 *data_crc)
 {
-   struct scatterlist sg;
+   struct scatterlist sg[2];
 
-   crypto_hash_init(hash);
+   sg_init_table(sg, ARRAY_SIZE(sg));
+   sg_set_buf(sg, buf, payload_length);
+   sg_set_buf(sg + 1, pad_bytes, padding);
 
-   sg_init_one(&sg, buf, payload_length);
-   crypto_hash_update(hash, &sg, payload_length);
+   ahash_request_set_crypt(hash, sg, data_crc, payload_length + padding);
 
-   if (padding) {
-   sg_init_one(&sg, pad_bytes, padding);
-   crypto_hash_update(hash, &sg, padding);
-   }
-   crypto_hash_final(hash, data_crc);
+   crypto_ahash_digest(hash);
 }
 
 int
@@ -1422,7 +1424,7 @@ iscsit_get_dataout(struct iscsi_conn *conn, struct 
iscsi_cmd *cmd,
if (conn->conn_ops->DataDigest) {
u32 data_crc;
 
-   data_crc = iscsit_do_crypto_hash_sg(&conn->conn_rx_hash, cmd,
+   data_crc = iscsit_do_crypto_hash_sg(conn->conn_rx_hash, cmd,
be32_to_cpu(hdr->offset),
payload_length, padding,
cmd->pad_bytes);
@@ -1682,7 +1684,7 @@ static int iscsit_handle_nop_out(struct iscsi_conn *conn, 
struct iscsi_cmd *cmd,
}
 
if (conn->conn_ops->DataDigest) {
-   iscsit_do_crypto_hash_buf(&conn->conn_rx_hash,
+   iscsit_do_crypto_hash_buf(conn->conn_rx_hash,
ping_data, payload_length,
padding, cmd->pad_bytes,
(u8 *)&data_crc);
@@ -2101,7 +2103,7 @@ iscsit_handle_text_cmd(struct iscsi_conn *conn, struct 
iscsi_cmd *cmd,
goto reject;
 
if (conn->conn_ops->DataDigest) {
-   iscsit_do_crypto_hash_buf(&conn->conn_rx_hash,
+   iscsit_do_crypto_hash_buf(conn->conn_rx_hash,
text_in, payload_length,
padding, (u8 *)&pad_bytes,
(u8 *)&data_crc);
@@ -2440,7 +2442,7 @@ static int iscsit_handle_immediate_data(
if (conn->c

[PATCH 26/26] tcp: Use ahash

2016-01-24 Thread Herbert Xu
This patch replaces uses of the long obsolete hash interface with
ahash.

Signed-off-by: Herbert Xu 
---

 include/net/tcp.h   |6 +-
 net/ipv4/tcp.c  |   41 ++---
 net/ipv4/tcp_fastopen.c |1 +
 net/ipv4/tcp_ipv4.c |   23 +--
 net/ipv6/tcp_ipv6.c |   23 +--
 5 files changed, 54 insertions(+), 40 deletions(-)

diff --git a/include/net/tcp.h b/include/net/tcp.h
index 8ea1997..2a5b3b8 100644
--- a/include/net/tcp.h
+++ b/include/net/tcp.h
@@ -27,7 +27,6 @@
 #include 
 #include 
 #include 
-#include 
 #include 
 #include 
 #include 
@@ -1325,9 +1324,6 @@ static inline void tcp_clear_all_retrans_hints(struct 
tcp_sock *tp)
tp->retransmit_skb_hint = NULL;
 }
 
-/* MD5 Signature */
-struct crypto_hash;
-
 union tcp_md5_addr {
struct in_addr  a4;
 #if IS_ENABLED(CONFIG_IPV6)
@@ -1376,7 +1372,7 @@ union tcp_md5sum_block {
 
 /* - pool: digest algorithm, hash description and scratch buffer */
 struct tcp_md5sig_pool {
-   struct hash_descmd5_desc;
+   struct ahash_request*md5_req;
union tcp_md5sum_block  md5_blk;
 };
 
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c
index fd17eec..91ffef3 100644
--- a/net/ipv4/tcp.c
+++ b/net/ipv4/tcp.c
@@ -247,6 +247,7 @@
 
 #define pr_fmt(fmt) "TCP: " fmt
 
+#include 
 #include 
 #include 
 #include 
@@ -266,7 +267,6 @@
 #include 
 #include 
 #include 
-#include 
 #include 
 #include 
 
@@ -2939,17 +2939,26 @@ static bool tcp_md5sig_pool_populated = false;
 
 static void __tcp_alloc_md5sig_pool(void)
 {
+   struct crypto_ahash *hash;
int cpu;
 
+   hash = crypto_alloc_ahash("md5", 0, CRYPTO_ALG_ASYNC);
+   if (IS_ERR_OR_NULL(hash))
+   return;
+
for_each_possible_cpu(cpu) {
-   if (!per_cpu(tcp_md5sig_pool, cpu).md5_desc.tfm) {
-   struct crypto_hash *hash;
+   struct ahash_request *req;
 
-   hash = crypto_alloc_hash("md5", 0, CRYPTO_ALG_ASYNC);
-   if (IS_ERR_OR_NULL(hash))
-   return;
-   per_cpu(tcp_md5sig_pool, cpu).md5_desc.tfm = hash;
-   }
+   if (per_cpu(tcp_md5sig_pool, cpu).md5_req)
+   continue;
+
+   req = ahash_request_alloc(hash, GFP_KERNEL);
+   if (!req)
+   return;
+
+   ahash_request_set_callback(req, 0, NULL, NULL);
+
+   per_cpu(tcp_md5sig_pool, cpu).md5_req = req;
}
/* before setting tcp_md5sig_pool_populated, we must commit all writes
 * to memory. See smp_rmb() in tcp_get_md5sig_pool()
@@ -2999,7 +3008,6 @@ int tcp_md5_hash_header(struct tcp_md5sig_pool *hp,
 {
struct scatterlist sg;
struct tcphdr hdr;
-   int err;
 
/* We are not allowed to change tcphdr, make a local copy */
memcpy(&hdr, th, sizeof(hdr));
@@ -3007,8 +3015,8 @@ int tcp_md5_hash_header(struct tcp_md5sig_pool *hp,
 
/* options aren't included in the hash */
sg_init_one(&sg, &hdr, sizeof(hdr));
-   err = crypto_hash_update(&hp->md5_desc, &sg, sizeof(hdr));
-   return err;
+   ahash_request_set_crypt(hp->md5_req, &sg, NULL, sizeof(hdr));
+   return crypto_ahash_update(hp->md5_req);
 }
 EXPORT_SYMBOL(tcp_md5_hash_header);
 
@@ -3017,7 +3025,7 @@ int tcp_md5_hash_skb_data(struct tcp_md5sig_pool *hp,
 {
struct scatterlist sg;
const struct tcphdr *tp = tcp_hdr(skb);
-   struct hash_desc *desc = &hp->md5_desc;
+   struct ahash_request *req = hp->md5_req;
unsigned int i;
const unsigned int head_data_len = skb_headlen(skb) > header_len ?
   skb_headlen(skb) - header_len : 0;
@@ -3027,7 +3035,8 @@ int tcp_md5_hash_skb_data(struct tcp_md5sig_pool *hp,
sg_init_table(&sg, 1);
 
sg_set_buf(&sg, ((u8 *) tp) + header_len, head_data_len);
-   if (crypto_hash_update(desc, &sg, head_data_len))
+   ahash_request_set_crypt(req, &sg, NULL, head_data_len);
+   if (crypto_ahash_update(req))
return 1;
 
for (i = 0; i < shi->nr_frags; ++i) {
@@ -3037,7 +3046,8 @@ int tcp_md5_hash_skb_data(struct tcp_md5sig_pool *hp,
 
sg_set_page(&sg, page, skb_frag_size(f),
offset_in_page(offset));
-   if (crypto_hash_update(desc, &sg, skb_frag_size(f)))
+   ahash_request_set_crypt(req, &sg, NULL, skb_frag_size(f));
+   if (crypto_ahash_update(req))
return 1;
}
 
@@ -3054,7 +3064,8 @@ int tcp_md5_hash_key(struct tcp_md5sig_pool *hp, const 
struct tcp_md5sig_key *ke
struct scatterlist sg;
 
sg_init_one(&sg, key->key, key->keylen);
-   return crypto_hash_update(&hp->md5_desc, &sg, key->keylen);
+   ahash_request_set_crypt(hp->md5_req, &sg, NULL, key->keylen)

[PATCH 11/26] f2fs: Use skcipher

2016-01-24 Thread Herbert Xu
This patch replaces uses of ablkcipher with skcipher.
   
Signed-off-by: Herbert Xu 
---

 fs/f2fs/crypto.c   |   24 +++-
 fs/f2fs/crypto_fname.c |   32 +++-
 fs/f2fs/crypto_key.c   |   40 ++--
 fs/f2fs/f2fs_crypto.h  |2 +-
 4 files changed, 45 insertions(+), 53 deletions(-)

diff --git a/fs/f2fs/crypto.c b/fs/f2fs/crypto.c
index 4a62ef1..95c5cf0 100644
--- a/fs/f2fs/crypto.c
+++ b/fs/f2fs/crypto.c
@@ -23,11 +23,9 @@
  * The usage of AES-XTS should conform to recommendations in NIST
  * Special Publication 800-38E and IEEE P1619/D16.
  */
-#include 
-#include 
+#include 
 #include 
 #include 
-#include 
 #include 
 #include 
 #include 
@@ -328,21 +326,21 @@ static int f2fs_page_crypto(struct f2fs_crypto_ctx *ctx,
struct page *dest_page)
 {
u8 xts_tweak[F2FS_XTS_TWEAK_SIZE];
-   struct ablkcipher_request *req = NULL;
+   struct skcipher_request *req = NULL;
DECLARE_F2FS_COMPLETION_RESULT(ecr);
struct scatterlist dst, src;
struct f2fs_crypt_info *ci = F2FS_I(inode)->i_crypt_info;
-   struct crypto_ablkcipher *tfm = ci->ci_ctfm;
+   struct crypto_skcipher *tfm = ci->ci_ctfm;
int res = 0;
 
-   req = ablkcipher_request_alloc(tfm, GFP_NOFS);
+   req = skcipher_request_alloc(tfm, GFP_NOFS);
if (!req) {
printk_ratelimited(KERN_ERR
"%s: crypto_request_alloc() failed\n",
__func__);
return -ENOMEM;
}
-   ablkcipher_request_set_callback(
+   skcipher_request_set_callback(
req, CRYPTO_TFM_REQ_MAY_BACKLOG | CRYPTO_TFM_REQ_MAY_SLEEP,
f2fs_crypt_complete, &ecr);
 
@@ -355,21 +353,21 @@ static int f2fs_page_crypto(struct f2fs_crypto_ctx *ctx,
sg_set_page(&dst, dest_page, PAGE_CACHE_SIZE, 0);
sg_init_table(&src, 1);
sg_set_page(&src, src_page, PAGE_CACHE_SIZE, 0);
-   ablkcipher_request_set_crypt(req, &src, &dst, PAGE_CACHE_SIZE,
-   xts_tweak);
+   skcipher_request_set_crypt(req, &src, &dst, PAGE_CACHE_SIZE,
+  xts_tweak);
if (rw == F2FS_DECRYPT)
-   res = crypto_ablkcipher_decrypt(req);
+   res = crypto_skcipher_decrypt(req);
else
-   res = crypto_ablkcipher_encrypt(req);
+   res = crypto_skcipher_encrypt(req);
if (res == -EINPROGRESS || res == -EBUSY) {
BUG_ON(req->base.data != &ecr);
wait_for_completion(&ecr.completion);
res = ecr.res;
}
-   ablkcipher_request_free(req);
+   skcipher_request_free(req);
if (res) {
printk_ratelimited(KERN_ERR
-   "%s: crypto_ablkcipher_encrypt() returned %d\n",
+   "%s: crypto_skcipher_encrypt() returned %d\n",
__func__, res);
return res;
}
diff --git a/fs/f2fs/crypto_fname.c b/fs/f2fs/crypto_fname.c
index ab377d4..16aec66 100644
--- a/fs/f2fs/crypto_fname.c
+++ b/fs/f2fs/crypto_fname.c
@@ -15,11 +15,9 @@
  *
  * This has not yet undergone a rigorous security audit.
  */
-#include 
-#include 
+#include 
 #include 
 #include 
-#include 
 #include 
 #include 
 #include 
@@ -70,10 +68,10 @@ static int f2fs_fname_encrypt(struct inode *inode,
const struct qstr *iname, struct f2fs_str *oname)
 {
u32 ciphertext_len;
-   struct ablkcipher_request *req = NULL;
+   struct skcipher_request *req = NULL;
DECLARE_F2FS_COMPLETION_RESULT(ecr);
struct f2fs_crypt_info *ci = F2FS_I(inode)->i_crypt_info;
-   struct crypto_ablkcipher *tfm = ci->ci_ctfm;
+   struct crypto_skcipher *tfm = ci->ci_ctfm;
int res = 0;
char iv[F2FS_CRYPTO_BLOCK_SIZE];
struct scatterlist src_sg, dst_sg;
@@ -99,14 +97,14 @@ static int f2fs_fname_encrypt(struct inode *inode,
}
 
/* Allocate request */
-   req = ablkcipher_request_alloc(tfm, GFP_NOFS);
+   req = skcipher_request_alloc(tfm, GFP_NOFS);
if (!req) {
printk_ratelimited(KERN_ERR
"%s: crypto_request_alloc() failed\n", __func__);
kfree(alloc_buf);
return -ENOMEM;
}
-   ablkcipher_request_set_callback(req,
+   skcipher_request_set_callback(req,
CRYPTO_TFM_REQ_MAY_BACKLOG | CRYPTO_TFM_REQ_MAY_SLEEP,
f2fs_dir_crypt_complete, &ecr);
 
@@ -121,15 +119,15 @@ static int f2fs_fname_encrypt(struct inode *inode,
/* Create encryption request */
sg_init_one(&src_sg, workbuf, ciphertext_len);
sg_init_one(&dst_sg, oname->name, ciphertext_len);
-   ablkcipher_request_set_crypt(req, &src_sg, &dst_sg, ciphertext_len, iv);
-   res = cryp

[PATCH 21/26] nfc: s3fwrn5: Use shash

2016-01-24 Thread Herbert Xu
This patch replaces uses of the long obsolete hash interface with
shash.

Signed-off-by: Herbert Xu 
---

 drivers/nfc/s3fwrn5/firmware.c |   36 +++-
 1 file changed, 27 insertions(+), 9 deletions(-)

diff --git a/drivers/nfc/s3fwrn5/firmware.c b/drivers/nfc/s3fwrn5/firmware.c
index 64a9025..5f97da1 100644
--- a/drivers/nfc/s3fwrn5/firmware.c
+++ b/drivers/nfc/s3fwrn5/firmware.c
@@ -19,7 +19,7 @@
 
 #include 
 #include 
-#include 
+#include 
 #include 
 
 #include "s3fwrn5.h"
@@ -429,8 +429,7 @@ int s3fwrn5_fw_download(struct s3fwrn5_fw_info *fw_info)
 {
struct s3fwrn5_fw_image *fw = &fw_info->fw;
u8 hash_data[SHA1_DIGEST_SIZE];
-   struct scatterlist sg;
-   struct hash_desc desc;
+   struct crypto_shash *tfm;
u32 image_size, off;
int ret;
 
@@ -438,12 +437,31 @@ int s3fwrn5_fw_download(struct s3fwrn5_fw_info *fw_info)
 
/* Compute SHA of firmware data */
 
-   sg_init_one(&sg, fw->image, image_size);
-   desc.tfm = crypto_alloc_hash("sha1", 0, CRYPTO_ALG_ASYNC);
-   crypto_hash_init(&desc);
-   crypto_hash_update(&desc, &sg, image_size);
-   crypto_hash_final(&desc, hash_data);
-   crypto_free_hash(desc.tfm);
+   tfm = crypto_alloc_shash("sha1", 0, 0);
+   if (IS_ERR(tfm)) {
+   ret = PTR_ERR(tfm);
+   dev_err(&fw_info->ndev->nfc_dev->dev,
+   "Cannot allocate shash (code=%d)\n", ret);
+   goto out;
+   }
+
+   {
+   SHASH_DESC_ON_STACK(desc, tfm);
+
+   desc->tfm = tfm;
+   desc->flags = CRYPTO_TFM_REQ_MAY_SLEEP;
+
+   ret = crypto_shash_digest(desc, fw->image, image_size,
+ hash_data);
+   shash_desc_zero(desc);
+   }
+
+   crypto_free_shash(tfm);
+   if (ret) {
+   dev_err(&fw_info->ndev->nfc_dev->dev,
+   "Cannot compute hash (code=%d)\n", ret);
+   goto out;
+   }
 
/* Firmware update process */
 
--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 14/26] KEYS: Use skcipher

2016-01-24 Thread Herbert Xu
This patch replaces uses of blkcipher with skcipher.
   
Signed-off-by: Herbert Xu 
---

 security/keys/encrypted-keys/encrypted.c |   82 ++-
 1 file changed, 50 insertions(+), 32 deletions(-)

diff --git a/security/keys/encrypted-keys/encrypted.c 
b/security/keys/encrypted-keys/encrypted.c
index 696ccfa..5adbfc3 100644
--- a/security/keys/encrypted-keys/encrypted.c
+++ b/security/keys/encrypted-keys/encrypted.c
@@ -28,11 +28,10 @@
 #include 
 #include 
 #include 
-#include 
 #include 
 #include 
 #include 
-#include 
+#include 
 
 #include "encrypted.h"
 #include "ecryptfs_format.h"
@@ -85,17 +84,17 @@ static const match_table_t key_tokens = {
 
 static int aes_get_sizes(void)
 {
-   struct crypto_blkcipher *tfm;
+   struct crypto_skcipher *tfm;
 
-   tfm = crypto_alloc_blkcipher(blkcipher_alg, 0, CRYPTO_ALG_ASYNC);
+   tfm = crypto_alloc_skcipher(blkcipher_alg, 0, CRYPTO_ALG_ASYNC);
if (IS_ERR(tfm)) {
pr_err("encrypted_key: failed to alloc_cipher (%ld)\n",
   PTR_ERR(tfm));
return PTR_ERR(tfm);
}
-   ivsize = crypto_blkcipher_ivsize(tfm);
-   blksize = crypto_blkcipher_blocksize(tfm);
-   crypto_free_blkcipher(tfm);
+   ivsize = crypto_skcipher_ivsize(tfm);
+   blksize = crypto_skcipher_blocksize(tfm);
+   crypto_free_skcipher(tfm);
return 0;
 }
 
@@ -401,28 +400,37 @@ static int get_derived_key(u8 *derived_key, enum 
derived_key_type key_type,
return ret;
 }
 
-static int init_blkcipher_desc(struct blkcipher_desc *desc, const u8 *key,
-  unsigned int key_len, const u8 *iv,
-  unsigned int ivsize)
+static struct skcipher_request *init_skcipher_req(const u8 *key,
+ unsigned int key_len)
 {
+   struct skcipher_request *req;
+   struct crypto_skcipher *tfm;
int ret;
 
-   desc->tfm = crypto_alloc_blkcipher(blkcipher_alg, 0, CRYPTO_ALG_ASYNC);
-   if (IS_ERR(desc->tfm)) {
+   tfm = crypto_alloc_skcipher(blkcipher_alg, 0, CRYPTO_ALG_ASYNC);
+   if (IS_ERR(tfm)) {
pr_err("encrypted_key: failed to load %s transform (%ld)\n",
-  blkcipher_alg, PTR_ERR(desc->tfm));
-   return PTR_ERR(desc->tfm);
+  blkcipher_alg, PTR_ERR(tfm));
+   return ERR_CAST(tfm);
}
-   desc->flags = 0;
 
-   ret = crypto_blkcipher_setkey(desc->tfm, key, key_len);
+   ret = crypto_skcipher_setkey(tfm, key, key_len);
if (ret < 0) {
pr_err("encrypted_key: failed to setkey (%d)\n", ret);
-   crypto_free_blkcipher(desc->tfm);
-   return ret;
+   crypto_free_skcipher(tfm);
+   return ERR_PTR(ret);
}
-   crypto_blkcipher_set_iv(desc->tfm, iv, ivsize);
-   return 0;
+
+   req = skcipher_request_alloc(tfm, GFP_KERNEL);
+   if (!req) {
+   pr_err("encrypted_key: failed to allocate request for %s\n",
+  blkcipher_alg);
+   crypto_free_skcipher(tfm);
+   return ERR_PTR(-ENOMEM);
+   }
+
+   skcipher_request_set_callback(req, 0, NULL, NULL);
+   return req;
 }
 
 static struct key *request_master_key(struct encrypted_key_payload *epayload,
@@ -467,7 +475,8 @@ static int derived_key_encrypt(struct encrypted_key_payload 
*epayload,
 {
struct scatterlist sg_in[2];
struct scatterlist sg_out[1];
-   struct blkcipher_desc desc;
+   struct crypto_skcipher *tfm;
+   struct skcipher_request *req;
unsigned int encrypted_datalen;
unsigned int padlen;
char pad[16];
@@ -476,9 +485,9 @@ static int derived_key_encrypt(struct encrypted_key_payload 
*epayload,
encrypted_datalen = roundup(epayload->decrypted_datalen, blksize);
padlen = encrypted_datalen - epayload->decrypted_datalen;
 
-   ret = init_blkcipher_desc(&desc, derived_key, derived_keylen,
- epayload->iv, ivsize);
-   if (ret < 0)
+   req = init_skcipher_req(derived_key, derived_keylen);
+   ret = PTR_ERR(req);
+   if (IS_ERR(req))
goto out;
dump_decrypted_data(epayload);
 
@@ -491,8 +500,12 @@ static int derived_key_encrypt(struct 
encrypted_key_payload *epayload,
sg_init_table(sg_out, 1);
sg_set_buf(sg_out, epayload->encrypted_data, encrypted_datalen);
 
-   ret = crypto_blkcipher_encrypt(&desc, sg_out, sg_in, encrypted_datalen);
-   crypto_free_blkcipher(desc.tfm);
+   skcipher_request_set_crypt(req, sg_in, sg_out, encrypted_datalen,
+  epayload->iv);
+   ret = crypto_skcipher_encrypt(req);
+   tfm = crypto_skcipher_reqtfm(req);
+   skcipher_request_free(req);
+   crypto_free_skcipher(tfm);
if (ret < 0)
pr_err("encrypted_key:

[PATCH 3/26] staging: rtl8192e: Replace uses of obsolete blkcipher and hash

2016-01-24 Thread Herbert Xu
The interfaces blkcipher and hash are obsolete.  This patch replaces
them with skcipher and ahash respectively.

Signed-off-by: Herbert Xu 
---

 drivers/staging/rtl8192e/rtllib_crypt_tkip.c |   99 ++-
 drivers/staging/rtl8192e/rtllib_crypt_wep.c  |   48 +++--
 2 files changed, 82 insertions(+), 65 deletions(-)

diff --git a/drivers/staging/rtl8192e/rtllib_crypt_tkip.c 
b/drivers/staging/rtl8192e/rtllib_crypt_tkip.c
index 2096d78..8eac7cd 100644
--- a/drivers/staging/rtl8192e/rtllib_crypt_tkip.c
+++ b/drivers/staging/rtl8192e/rtllib_crypt_tkip.c
@@ -9,6 +9,8 @@
  * more details.
  */
 
+#include 
+#include 
 #include 
 #include 
 #include 
@@ -18,7 +20,6 @@
 #include 
 #include 
 #include 
-#include 
 #include 
 #include 
 #include 
@@ -48,10 +49,10 @@ struct rtllib_tkip_data {
u32 dot11RSNAStatsTKIPLocalMICFailures;
 
int key_idx;
-   struct crypto_blkcipher *rx_tfm_arc4;
-   struct crypto_hash *rx_tfm_michael;
-   struct crypto_blkcipher *tx_tfm_arc4;
-   struct crypto_hash *tx_tfm_michael;
+   struct crypto_skcipher *rx_tfm_arc4;
+   struct crypto_ahash *rx_tfm_michael;
+   struct crypto_skcipher *tx_tfm_arc4;
+   struct crypto_ahash *tx_tfm_michael;
/* scratch buffers for virt_to_page() (crypto API) */
u8 rx_hdr[16];
u8 tx_hdr[16];
@@ -65,32 +66,32 @@ static void *rtllib_tkip_init(int key_idx)
if (priv == NULL)
goto fail;
priv->key_idx = key_idx;
-   priv->tx_tfm_arc4 = crypto_alloc_blkcipher("ecb(arc4)", 0,
-   CRYPTO_ALG_ASYNC);
+   priv->tx_tfm_arc4 = crypto_alloc_skcipher("ecb(arc4)", 0,
+ CRYPTO_ALG_ASYNC);
if (IS_ERR(priv->tx_tfm_arc4)) {
pr_debug("Could not allocate crypto API arc4\n");
priv->tx_tfm_arc4 = NULL;
goto fail;
}
 
-   priv->tx_tfm_michael = crypto_alloc_hash("michael_mic", 0,
-   CRYPTO_ALG_ASYNC);
+   priv->tx_tfm_michael = crypto_alloc_ahash("michael_mic", 0,
+ CRYPTO_ALG_ASYNC);
if (IS_ERR(priv->tx_tfm_michael)) {
pr_debug("Could not allocate crypto API michael_mic\n");
priv->tx_tfm_michael = NULL;
goto fail;
}
 
-   priv->rx_tfm_arc4 = crypto_alloc_blkcipher("ecb(arc4)", 0,
-   CRYPTO_ALG_ASYNC);
+   priv->rx_tfm_arc4 = crypto_alloc_skcipher("ecb(arc4)", 0,
+ CRYPTO_ALG_ASYNC);
if (IS_ERR(priv->rx_tfm_arc4)) {
pr_debug("Could not allocate crypto API arc4\n");
priv->rx_tfm_arc4 = NULL;
goto fail;
}
 
-   priv->rx_tfm_michael = crypto_alloc_hash("michael_mic", 0,
-   CRYPTO_ALG_ASYNC);
+   priv->rx_tfm_michael = crypto_alloc_ahash("michael_mic", 0,
+ CRYPTO_ALG_ASYNC);
if (IS_ERR(priv->rx_tfm_michael)) {
pr_debug("Could not allocate crypto API michael_mic\n");
priv->rx_tfm_michael = NULL;
@@ -100,14 +101,10 @@ static void *rtllib_tkip_init(int key_idx)
 
 fail:
if (priv) {
-   if (priv->tx_tfm_michael)
-   crypto_free_hash(priv->tx_tfm_michael);
-   if (priv->tx_tfm_arc4)
-   crypto_free_blkcipher(priv->tx_tfm_arc4);
-   if (priv->rx_tfm_michael)
-   crypto_free_hash(priv->rx_tfm_michael);
-   if (priv->rx_tfm_arc4)
-   crypto_free_blkcipher(priv->rx_tfm_arc4);
+   crypto_free_ahash(priv->tx_tfm_michael);
+   crypto_free_skcipher(priv->tx_tfm_arc4);
+   crypto_free_ahash(priv->rx_tfm_michael);
+   crypto_free_skcipher(priv->rx_tfm_arc4);
kfree(priv);
}
 
@@ -120,14 +117,10 @@ static void rtllib_tkip_deinit(void *priv)
struct rtllib_tkip_data *_priv = priv;
 
if (_priv) {
-   if (_priv->tx_tfm_michael)
-   crypto_free_hash(_priv->tx_tfm_michael);
-   if (_priv->tx_tfm_arc4)
-   crypto_free_blkcipher(_priv->tx_tfm_arc4);
-   if (_priv->rx_tfm_michael)
-   crypto_free_hash(_priv->rx_tfm_michael);
-   if (_priv->rx_tfm_arc4)
-   crypto_free_blkcipher(_priv->rx_tfm_arc4);
+   crypto_free_ahash(_priv->tx_tfm_michael);
+   crypto_free_skcipher(_priv->tx_tfm_arc4);
+   crypto_free_ahash(_priv->rx_tfm_michael);
+   crypto_free_skcipher(_priv->rx_tfm_arc4);
}
kfree(priv);
 }
@@ -301,7 +294,6 @@ static int rtllib_tkip_encrypt(struct sk_buff *skb, int 
hdr_len, void *priv)
struct rtllib_hdr_4addr *hdr;
struct 

[PATCH 1/26] block: cryptoloop - Use new skcipher interface

2016-01-24 Thread Herbert Xu
This patch replaces uses of blkcipher with the new skcipher
interface.

Signed-off-by: Herbert Xu 
---

 drivers/block/cryptoloop.c |   48 +++--
 1 file changed, 25 insertions(+), 23 deletions(-)

diff --git a/drivers/block/cryptoloop.c b/drivers/block/cryptoloop.c
index 99e773c..3d31761 100644
--- a/drivers/block/cryptoloop.c
+++ b/drivers/block/cryptoloop.c
@@ -21,9 +21,9 @@
 
 #include 
 
+#include 
 #include 
 #include 
-#include 
 #include 
 #include 
 #include 
@@ -46,7 +46,7 @@ cryptoloop_init(struct loop_device *lo, const struct 
loop_info64 *info)
char *cipher;
char *mode;
char *cmsp = cms;   /* c-m string pointer */
-   struct crypto_blkcipher *tfm;
+   struct crypto_skcipher *tfm;
 
/* encryption breaks for non sector aligned offsets */
 
@@ -82,12 +82,12 @@ cryptoloop_init(struct loop_device *lo, const struct 
loop_info64 *info)
*cmsp++ = ')';
*cmsp = 0;
 
-   tfm = crypto_alloc_blkcipher(cms, 0, CRYPTO_ALG_ASYNC);
+   tfm = crypto_alloc_skcipher(cms, 0, CRYPTO_ALG_ASYNC);
if (IS_ERR(tfm))
return PTR_ERR(tfm);
 
-   err = crypto_blkcipher_setkey(tfm, info->lo_encrypt_key,
- info->lo_encrypt_key_size);
+   err = crypto_skcipher_setkey(tfm, info->lo_encrypt_key,
+info->lo_encrypt_key_size);

if (err != 0)
goto out_free_tfm;
@@ -96,17 +96,14 @@ cryptoloop_init(struct loop_device *lo, const struct 
loop_info64 *info)
return 0;
 
  out_free_tfm:
-   crypto_free_blkcipher(tfm);
+   crypto_free_skcipher(tfm);
 
  out:
return err;
 }
 
 
-typedef int (*encdec_cbc_t)(struct blkcipher_desc *desc,
-   struct scatterlist *sg_out,
-   struct scatterlist *sg_in,
-   unsigned int nsg);
+typedef int (*encdec_cbc_t)(struct skcipher_request *req);
 
 static int
 cryptoloop_transfer(struct loop_device *lo, int cmd,
@@ -114,11 +111,8 @@ cryptoloop_transfer(struct loop_device *lo, int cmd,
struct page *loop_page, unsigned loop_off,
int size, sector_t IV)
 {
-   struct crypto_blkcipher *tfm = lo->key_data;
-   struct blkcipher_desc desc = {
-   .tfm = tfm,
-   .flags = CRYPTO_TFM_REQ_MAY_SLEEP,
-   };
+   struct crypto_skcipher *tfm = lo->key_data;
+   SKCIPHER_REQUEST_ON_STACK(req, tfm);
struct scatterlist sg_out;
struct scatterlist sg_in;
 
@@ -127,6 +121,10 @@ cryptoloop_transfer(struct loop_device *lo, int cmd,
unsigned in_offs, out_offs;
int err;
 
+   skcipher_request_set_tfm(req, tfm);
+   skcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_SLEEP,
+ NULL, NULL);
+
sg_init_table(&sg_out, 1);
sg_init_table(&sg_in, 1);
 
@@ -135,13 +133,13 @@ cryptoloop_transfer(struct loop_device *lo, int cmd,
in_offs = raw_off;
out_page = loop_page;
out_offs = loop_off;
-   encdecfunc = crypto_blkcipher_crt(tfm)->decrypt;
+   encdecfunc = crypto_skcipher_decrypt;
} else {
in_page = loop_page;
in_offs = loop_off;
out_page = raw_page;
out_offs = raw_off;
-   encdecfunc = crypto_blkcipher_crt(tfm)->encrypt;
+   encdecfunc = crypto_skcipher_encrypt;
}
 
while (size > 0) {
@@ -152,10 +150,10 @@ cryptoloop_transfer(struct loop_device *lo, int cmd,
sg_set_page(&sg_in, in_page, sz, in_offs);
sg_set_page(&sg_out, out_page, sz, out_offs);
 
-   desc.info = iv;
-   err = encdecfunc(&desc, &sg_out, &sg_in, sz);
+   skcipher_request_set_crypt(req, &sg_in, &sg_out, sz, iv);
+   err = encdecfunc(req);
if (err)
-   return err;
+   goto out;
 
IV++;
size -= sz;
@@ -163,7 +161,11 @@ cryptoloop_transfer(struct loop_device *lo, int cmd,
out_offs += sz;
}
 
-   return 0;
+   err = 0;
+
+out:
+   skcipher_request_zero(req);
+   return err;
 }
 
 static int
@@ -175,9 +177,9 @@ cryptoloop_ioctl(struct loop_device *lo, int cmd, unsigned 
long arg)
 static int
 cryptoloop_release(struct loop_device *lo)
 {
-   struct crypto_blkcipher *tfm = lo->key_data;
+   struct crypto_skcipher *tfm = lo->key_data;
if (tfm != NULL) {
-   crypto_free_blkcipher(tfm);
+   crypto_free_skcipher(tfm);
lo->key_data = NULL;
return 0;
}
--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger

[PATCH 0/26] crypto: Use skcipher and ahash/shash where possible

2016-01-24 Thread Herbert Xu
Hi:

The crypto hash interface has been obsolete for many years and
this series converts all remaining users to shash and ahash as
appropriate.  Despite the name ahash can be used synchronously
and is the preferred interface for those dealing with SGs.

The blkcipher and ablkcipher interfaces are also being phased out
and is being replaced with the merged skcipher interface which
is essentially the same as ablkcipher but without the implicit
IV generators.  This series converts all users of blkcipher and
ablkcipher over to skcipher.

If you have any objections please shout.  Otherwise I would like
to take these patches through the cryptodev tree so we can proceed
with phasing out the obsolete interfaces.

Thanks,
-- 
Email: Herbert Xu 
Home Page: http://gondor.apana.org.au/~herbert/
PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt
--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH] iwlwifi: dvm: handle zero brightness for wifi LED

2016-01-24 Thread Hubert Tarasiuk
This fixes bug 110551 with regard to sysfs.

Misleading behaviour when 'led_mode=3' is passed to iwlwifi is still
to be fixed (either by changing the option description or by making
the LED permanently dark in such case).

Signed-off-by: Hubert Tarasiuk 
---
 drivers/net/wireless/iwlwifi/dvm/led.c | 5 -
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/drivers/net/wireless/iwlwifi/dvm/led.c 
b/drivers/net/wireless/iwlwifi/dvm/led.c
index ca4d669..218617a 100644
--- a/drivers/net/wireless/iwlwifi/dvm/led.c
+++ b/drivers/net/wireless/iwlwifi/dvm/led.c
@@ -154,11 +154,14 @@ static void iwl_led_brightness_set(struct led_classdev 
*led_cdev,
 {
struct iwl_priv *priv = container_of(led_cdev, struct iwl_priv, led);
unsigned long on = 0;
+   unsigned long off = 0;
 
if (brightness > 0)
on = IWL_LED_SOLID;
+   else
+   off = IWL_LED_SOLID;
 
-   iwl_led_cmd(priv, on, 0);
+   iwl_led_cmd(priv, on, off);
 }
 
 static int iwl_led_blink_set(struct led_classdev *led_cdev,
-- 
2.7.0

--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [Bug 110551] iwlwifi: dvm: cannot turn off wifi LED

2016-01-24 Thread Emmanuel Grumbach
On Sun, Jan 24, 2016 at 12:32 PM, Hubert Tarasiuk
 wrote:
> Attached is the patch for bug 110551.
>
> W dniu 24.01.2016 o 11:16, bugzilla-dae...@bugzilla.kernel.org pisze:
>> https://bugzilla.kernel.org/show_bug.cgi?id=110551
>>
>> --- Comment #13 from Emmanuel Grumbach  ---
>> https://bugzilla.kernel.org/attachment.cgi?id=201271
>>
>> This one seems to have a fix for the module param as well.
>> I would much prefer you to send the patch to the wireless mailing list rather
>> than attaching it to this bugzilla.
>>

The better way is send the patches with git-send-email tool.
--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [Bug 110551] iwlwifi: dvm: cannot turn off wifi LED

2016-01-24 Thread Hubert Tarasiuk
Attached is the patch for bug 110551.

W dniu 24.01.2016 o 11:16, bugzilla-dae...@bugzilla.kernel.org pisze:
> https://bugzilla.kernel.org/show_bug.cgi?id=110551
> 
> --- Comment #13 from Emmanuel Grumbach  ---
> https://bugzilla.kernel.org/attachment.cgi?id=201271
> 
> This one seems to have a fix for the module param as well.
> I would much prefer you to send the patch to the wireless mailing list rather
> than attaching it to this bugzilla.
> 
From 40e783a5464e43722d87b5cb0c3d3899f3f7417e Mon Sep 17 00:00:00 2001
From: Hubert Tarasiuk 
Date: Mon, 4 Jan 2016 23:45:18 +0100
Subject: [PATCH] iwlwifi: dvm: handle zero brightness for wifi LED

This fixes bug 110551 with regard to sysfs.

Misleading behaviour when 'led_mode=3' is passed to iwlwifi is still
to be fixed (either by changing the option description or by making
the LED permanently dark in such case).

Signed-off-by: Hubert Tarasiuk 
---
 drivers/net/wireless/iwlwifi/dvm/led.c | 5 -
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/drivers/net/wireless/iwlwifi/dvm/led.c b/drivers/net/wireless/iwlwifi/dvm/led.c
index ca4d669..218617a 100644
--- a/drivers/net/wireless/iwlwifi/dvm/led.c
+++ b/drivers/net/wireless/iwlwifi/dvm/led.c
@@ -154,11 +154,14 @@ static void iwl_led_brightness_set(struct led_classdev *led_cdev,
 {
 	struct iwl_priv *priv = container_of(led_cdev, struct iwl_priv, led);
 	unsigned long on = 0;
+	unsigned long off = 0;
 
 	if (brightness > 0)
 		on = IWL_LED_SOLID;
+	else
+		off = IWL_LED_SOLID;
 
-	iwl_led_cmd(priv, on, 0);
+	iwl_led_cmd(priv, on, off);
 }
 
 static int iwl_led_blink_set(struct led_classdev *led_cdev,
-- 
2.7.0



signature.asc
Description: OpenPGP digital signature