diff options
Diffstat (limited to 'drivers/s390/net/qeth_l2_main.c')
| -rw-r--r-- | drivers/s390/net/qeth_l2_main.c | 108 | 
1 files changed, 55 insertions, 53 deletions
diff --git a/drivers/s390/net/qeth_l2_main.c b/drivers/s390/net/qeth_l2_main.c index d43f57a4ac6..830d63524d6 100644 --- a/drivers/s390/net/qeth_l2_main.c +++ b/drivers/s390/net/qeth_l2_main.c @@ -79,7 +79,7 @@ static int qeth_l2_do_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)  		rc = -EOPNOTSUPP;  	}  	if (rc) -		QETH_DBF_TEXT_(TRACE, 2, "ioce%d", rc); +		QETH_CARD_TEXT_(card, 2, "ioce%d", rc);  	return rc;  } @@ -130,7 +130,7 @@ static int qeth_l2_send_setgroupmac_cb(struct qeth_card *card,  	struct qeth_ipa_cmd *cmd;  	__u8 *mac; -	QETH_DBF_TEXT(TRACE, 2, "L2Sgmacb"); +	QETH_CARD_TEXT(card, 2, "L2Sgmacb");  	cmd = (struct qeth_ipa_cmd *) data;  	mac = &cmd->data.setdelmac.mac[0];  	/* MAC already registered, needed in couple/uncouple case */ @@ -147,7 +147,7 @@ static int qeth_l2_send_setgroupmac_cb(struct qeth_card *card,  static int qeth_l2_send_setgroupmac(struct qeth_card *card, __u8 *mac)  { -	QETH_DBF_TEXT(TRACE, 2, "L2Sgmac"); +	QETH_CARD_TEXT(card, 2, "L2Sgmac");  	return qeth_l2_send_setdelmac(card, mac, IPA_CMD_SETGMAC,  					  qeth_l2_send_setgroupmac_cb);  } @@ -159,7 +159,7 @@ static int qeth_l2_send_delgroupmac_cb(struct qeth_card *card,  	struct qeth_ipa_cmd *cmd;  	__u8 *mac; -	QETH_DBF_TEXT(TRACE, 2, "L2Dgmacb"); +	QETH_CARD_TEXT(card, 2, "L2Dgmacb");  	cmd = (struct qeth_ipa_cmd *) data;  	mac = &cmd->data.setdelmac.mac[0];  	if (cmd->hdr.return_code) @@ -170,7 +170,7 @@ static int qeth_l2_send_delgroupmac_cb(struct qeth_card *card,  static int qeth_l2_send_delgroupmac(struct qeth_card *card, __u8 *mac)  { -	QETH_DBF_TEXT(TRACE, 2, "L2Dgmac"); +	QETH_CARD_TEXT(card, 2, "L2Dgmac");  	return qeth_l2_send_setdelmac(card, mac, IPA_CMD_DELGMAC,  					  qeth_l2_send_delgroupmac_cb);  } @@ -262,15 +262,14 @@ static int qeth_l2_send_setdelvlan_cb(struct qeth_card *card,  {  	struct qeth_ipa_cmd *cmd; -	QETH_DBF_TEXT(TRACE, 2, "L2sdvcb"); +	QETH_CARD_TEXT(card, 2, "L2sdvcb");  	cmd = (struct qeth_ipa_cmd *) data;  	if (cmd->hdr.return_code) {  		QETH_DBF_MESSAGE(2, "Error in processing VLAN %i on %s: 0x%x. "  			  "Continuing\n", cmd->data.setdelvlan.vlan_id,  			  QETH_CARD_IFNAME(card), cmd->hdr.return_code); -		QETH_DBF_TEXT_(TRACE, 2, "L2VL%4x", cmd->hdr.command); -		QETH_DBF_TEXT_(TRACE, 2, "L2%s", CARD_BUS_ID(card)); -		QETH_DBF_TEXT_(TRACE, 2, "err%d", cmd->hdr.return_code); +		QETH_CARD_TEXT_(card, 2, "L2VL%4x", cmd->hdr.command); +		QETH_CARD_TEXT_(card, 2, "err%d", cmd->hdr.return_code);  	}  	return 0;  } @@ -281,7 +280,7 @@ static int qeth_l2_send_setdelvlan(struct qeth_card *card, __u16 i,  	struct qeth_ipa_cmd *cmd;  	struct qeth_cmd_buffer *iob; -	QETH_DBF_TEXT_(TRACE, 4, "L2sdv%x", ipacmd); +	QETH_CARD_TEXT_(card, 4, "L2sdv%x", ipacmd);  	iob = qeth_get_ipacmd_buffer(card, ipacmd, QETH_PROT_IPV4);  	cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);  	cmd->data.setdelvlan.vlan_id = i; @@ -292,7 +291,7 @@ static int qeth_l2_send_setdelvlan(struct qeth_card *card, __u16 i,  static void qeth_l2_process_vlans(struct qeth_card *card, int clear)  {  	struct qeth_vlan_vid *id; -	QETH_DBF_TEXT(TRACE, 3, "L2prcvln"); +	QETH_CARD_TEXT(card, 3, "L2prcvln");  	spin_lock_bh(&card->vlanlock);  	list_for_each_entry(id, &card->vid_list, list) {  		if (clear) @@ -310,13 +309,13 @@ static void qeth_l2_vlan_rx_add_vid(struct net_device *dev, unsigned short vid)  	struct qeth_card *card = dev->ml_priv;  	struct qeth_vlan_vid *id; -	QETH_DBF_TEXT_(TRACE, 4, "aid:%d", vid); +	QETH_CARD_TEXT_(card, 4, "aid:%d", vid);  	if (card->info.type == QETH_CARD_TYPE_OSM) { -		QETH_DBF_TEXT(TRACE, 3, "aidOSM"); +		QETH_CARD_TEXT(card, 3, "aidOSM");  		return;  	}  	if (qeth_wait_for_threads(card, QETH_RECOVER_THREAD)) { -		QETH_DBF_TEXT(TRACE, 3, "aidREC"); +		QETH_CARD_TEXT(card, 3, "aidREC");  		return;  	}  	id = kmalloc(sizeof(struct qeth_vlan_vid), GFP_ATOMIC); @@ -334,13 +333,13 @@ static void qeth_l2_vlan_rx_kill_vid(struct net_device *dev, unsigned short vid)  	struct qeth_vlan_vid *id, *tmpid = NULL;  	struct qeth_card *card = dev->ml_priv; -	QETH_DBF_TEXT_(TRACE, 4, "kid:%d", vid); +	QETH_CARD_TEXT_(card, 4, "kid:%d", vid);  	if (card->info.type == QETH_CARD_TYPE_OSM) { -		QETH_DBF_TEXT(TRACE, 3, "kidOSM"); +		QETH_CARD_TEXT(card, 3, "kidOSM");  		return;  	}  	if (qeth_wait_for_threads(card, QETH_RECOVER_THREAD)) { -		QETH_DBF_TEXT(TRACE, 3, "kidREC"); +		QETH_CARD_TEXT(card, 3, "kidREC");  		return;  	}  	spin_lock_bh(&card->vlanlock); @@ -456,7 +455,7 @@ static void qeth_l2_process_inbound_buffer(struct qeth_card *card,  			/* else unknown */  		default:  			dev_kfree_skb_any(skb); -			QETH_DBF_TEXT(TRACE, 3, "inbunkno"); +			QETH_CARD_TEXT(card, 3, "inbunkno");  			QETH_DBF_HEX(CTRL, 3, hdr, QETH_DBF_CTRL_LEN);  			continue;  		} @@ -474,7 +473,7 @@ static int qeth_l2_send_setdelmac(struct qeth_card *card, __u8 *mac,  	struct qeth_ipa_cmd *cmd;  	struct qeth_cmd_buffer *iob; -	QETH_DBF_TEXT(TRACE, 2, "L2sdmac"); +	QETH_CARD_TEXT(card, 2, "L2sdmac");  	iob = qeth_get_ipacmd_buffer(card, ipacmd, QETH_PROT_IPV4);  	cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);  	cmd->data.setdelmac.mac_length = OSA_ADDR_LEN; @@ -488,10 +487,10 @@ static int qeth_l2_send_setmac_cb(struct qeth_card *card,  {  	struct qeth_ipa_cmd *cmd; -	QETH_DBF_TEXT(TRACE, 2, "L2Smaccb"); +	QETH_CARD_TEXT(card, 2, "L2Smaccb");  	cmd = (struct qeth_ipa_cmd *) data;  	if (cmd->hdr.return_code) { -		QETH_DBF_TEXT_(TRACE, 2, "L2er%x", cmd->hdr.return_code); +		QETH_CARD_TEXT_(card, 2, "L2er%x", cmd->hdr.return_code);  		card->info.mac_bits &= ~QETH_LAYER2_MAC_REGISTERED;  		switch (cmd->hdr.return_code) {  		case IPA_RC_L2_DUP_MAC: @@ -523,7 +522,7 @@ static int qeth_l2_send_setmac_cb(struct qeth_card *card,  static int qeth_l2_send_setmac(struct qeth_card *card, __u8 *mac)  { -	QETH_DBF_TEXT(TRACE, 2, "L2Setmac"); +	QETH_CARD_TEXT(card, 2, "L2Setmac");  	return qeth_l2_send_setdelmac(card, mac, IPA_CMD_SETVMAC,  					  qeth_l2_send_setmac_cb);  } @@ -534,10 +533,10 @@ static int qeth_l2_send_delmac_cb(struct qeth_card *card,  {  	struct qeth_ipa_cmd *cmd; -	QETH_DBF_TEXT(TRACE, 2, "L2Dmaccb"); +	QETH_CARD_TEXT(card, 2, "L2Dmaccb");  	cmd = (struct qeth_ipa_cmd *) data;  	if (cmd->hdr.return_code) { -		QETH_DBF_TEXT_(TRACE, 2, "err%d", cmd->hdr.return_code); +		QETH_CARD_TEXT_(card, 2, "err%d", cmd->hdr.return_code);  		cmd->hdr.return_code = -EIO;  		return 0;  	} @@ -548,7 +547,7 @@ static int qeth_l2_send_delmac_cb(struct qeth_card *card,  static int qeth_l2_send_delmac(struct qeth_card *card, __u8 *mac)  { -	QETH_DBF_TEXT(TRACE, 2, "L2Delmac"); +	QETH_CARD_TEXT(card, 2, "L2Delmac");  	if (!(card->info.mac_bits & QETH_LAYER2_MAC_REGISTERED))  		return 0;  	return qeth_l2_send_setdelmac(card, mac, IPA_CMD_DELVMAC, @@ -594,23 +593,22 @@ static int qeth_l2_set_mac_address(struct net_device *dev, void *p)  	struct qeth_card *card = dev->ml_priv;  	int rc = 0; -	QETH_DBF_TEXT(TRACE, 3, "setmac"); +	QETH_CARD_TEXT(card, 3, "setmac");  	if (qeth_l2_verify_dev(dev) != QETH_REAL_CARD) { -		QETH_DBF_TEXT(TRACE, 3, "setmcINV"); +		QETH_CARD_TEXT(card, 3, "setmcINV");  		return -EOPNOTSUPP;  	}  	if (card->info.type == QETH_CARD_TYPE_OSN ||  	    card->info.type == QETH_CARD_TYPE_OSM ||  	    card->info.type == QETH_CARD_TYPE_OSX) { -		QETH_DBF_TEXT(TRACE, 3, "setmcTYP"); +		QETH_CARD_TEXT(card, 3, "setmcTYP");  		return -EOPNOTSUPP;  	} -	QETH_DBF_TEXT_(TRACE, 3, "%s", CARD_BUS_ID(card)); -	QETH_DBF_HEX(TRACE, 3, addr->sa_data, OSA_ADDR_LEN); +	QETH_CARD_HEX(card, 3, addr->sa_data, OSA_ADDR_LEN);  	if (qeth_wait_for_threads(card, QETH_RECOVER_THREAD)) { -		QETH_DBF_TEXT(TRACE, 3, "setmcREC"); +		QETH_CARD_TEXT(card, 3, "setmcREC");  		return -ERESTARTSYS;  	}  	rc = qeth_l2_send_delmac(card, &card->dev->dev_addr[0]); @@ -627,7 +625,7 @@ static void qeth_l2_set_multicast_list(struct net_device *dev)  	if (card->info.type == QETH_CARD_TYPE_OSN)  		return ; -	QETH_DBF_TEXT(TRACE, 3, "setmulti"); +	QETH_CARD_TEXT(card, 3, "setmulti");  	if (qeth_threads_running(card, QETH_RECOVER_THREAD) &&  	    (card->state != CARD_STATE_UP))  		return; @@ -714,10 +712,13 @@ static int qeth_l2_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)  		goto tx_drop;  	} -	if (card->info.type != QETH_CARD_TYPE_IQD) +	if (card->info.type != QETH_CARD_TYPE_IQD) { +		if (qeth_hdr_chk_and_bounce(new_skb, +		    sizeof(struct qeth_hdr_layer2))) +			goto tx_drop;  		rc = qeth_do_send_packet(card, queue, new_skb, hdr,  					 elements); -	else +	} else  		rc = qeth_do_send_packet_fast(card, queue, new_skb, hdr,  					elements, data_offset, hd_len);  	if (!rc) { @@ -771,11 +772,10 @@ static void qeth_l2_qdio_input_handler(struct ccw_device *ccwdev,  		card->perf_stats.inbound_start_time = qeth_get_micros();  	}  	if (qdio_err & QDIO_ERROR_ACTIVATE_CHECK_CONDITION) { -		QETH_DBF_TEXT(TRACE, 1, "qdinchk"); -		QETH_DBF_TEXT_(TRACE, 1, "%s", CARD_BUS_ID(card)); -		QETH_DBF_TEXT_(TRACE, 1, "%04X%04X", first_element, +		QETH_CARD_TEXT(card, 1, "qdinchk"); +		QETH_CARD_TEXT_(card, 1, "%04X%04X", first_element,  				count); -		QETH_DBF_TEXT_(TRACE, 1, "%04X", queue); +		QETH_CARD_TEXT_(card, 1, "%04X", queue);  		qeth_schedule_recovery(card);  		return;  	} @@ -799,13 +799,13 @@ static int qeth_l2_open(struct net_device *dev)  {  	struct qeth_card *card = dev->ml_priv; -	QETH_DBF_TEXT(TRACE, 4, "qethopen"); +	QETH_CARD_TEXT(card, 4, "qethopen");  	if (card->state != CARD_STATE_SOFTSETUP)  		return -ENODEV;  	if ((card->info.type != QETH_CARD_TYPE_OSN) &&  	     (!(card->info.mac_bits & QETH_LAYER2_MAC_REGISTERED))) { -		QETH_DBF_TEXT(TRACE, 4, "nomacadr"); +		QETH_CARD_TEXT(card, 4, "nomacadr");  		return -EPERM;  	}  	card->data.state = CH_STATE_UP; @@ -822,7 +822,7 @@ static int qeth_l2_stop(struct net_device *dev)  {  	struct qeth_card *card = dev->ml_priv; -	QETH_DBF_TEXT(TRACE, 4, "qethstop"); +	QETH_CARD_TEXT(card, 4, "qethstop");  	netif_tx_disable(dev);  	if (card->state == CARD_STATE_UP)  		card->state = CARD_STATE_SOFTSETUP; @@ -860,8 +860,6 @@ static void qeth_l2_remove_device(struct ccwgroup_device *cgdev)  		unregister_netdev(card->dev);  		card->dev = NULL;  	} - -	qeth_l2_del_all_mc(card);  	return;  } @@ -935,6 +933,7 @@ static int __qeth_l2_set_online(struct ccwgroup_device *gdev, int recovery_mode)  	enum qeth_card_states recover_flag;  	BUG_ON(!card); +	mutex_lock(&card->discipline_mutex);  	mutex_lock(&card->conf_mutex);  	QETH_DBF_TEXT(SETUP, 2, "setonlin");  	QETH_DBF_HEX(SETUP, 2, &card, sizeof(void *)); @@ -1012,6 +1011,7 @@ static int __qeth_l2_set_online(struct ccwgroup_device *gdev, int recovery_mode)  	kobject_uevent(&gdev->dev.kobj, KOBJ_CHANGE);  out:  	mutex_unlock(&card->conf_mutex); +	mutex_unlock(&card->discipline_mutex);  	return 0;  out_remove: @@ -1025,6 +1025,7 @@ out_remove:  	else  		card->state = CARD_STATE_DOWN;  	mutex_unlock(&card->conf_mutex); +	mutex_unlock(&card->discipline_mutex);  	return rc;  } @@ -1040,6 +1041,7 @@ static int __qeth_l2_set_offline(struct ccwgroup_device *cgdev,  	int rc = 0, rc2 = 0, rc3 = 0;  	enum qeth_card_states recover_flag; +	mutex_lock(&card->discipline_mutex);  	mutex_lock(&card->conf_mutex);  	QETH_DBF_TEXT(SETUP, 3, "setoffl");  	QETH_DBF_HEX(SETUP, 3, &card, sizeof(void *)); @@ -1060,6 +1062,7 @@ static int __qeth_l2_set_offline(struct ccwgroup_device *cgdev,  	/* let user_space know that device is offline */  	kobject_uevent(&cgdev->dev.kobj, KOBJ_CHANGE);  	mutex_unlock(&card->conf_mutex); +	mutex_unlock(&card->discipline_mutex);  	return 0;  } @@ -1074,11 +1077,10 @@ static int qeth_l2_recover(void *ptr)  	int rc = 0;  	card = (struct qeth_card *) ptr; -	QETH_DBF_TEXT(TRACE, 2, "recover1"); -	QETH_DBF_HEX(TRACE, 2, &card, sizeof(void *)); +	QETH_CARD_TEXT(card, 2, "recover1");  	if (!qeth_do_run_thread(card, QETH_RECOVER_THREAD))  		return 0; -	QETH_DBF_TEXT(TRACE, 2, "recover2"); +	QETH_CARD_TEXT(card, 2, "recover2");  	dev_warn(&card->gdev->dev,  		"A recovery process has been started for the device\n");  	card->use_hard_stop = 1; @@ -1181,12 +1183,12 @@ static int qeth_osn_send_control_data(struct qeth_card *card, int len,  	unsigned long flags;  	int rc = 0; -	QETH_DBF_TEXT(TRACE, 5, "osndctrd"); +	QETH_CARD_TEXT(card, 5, "osndctrd");  	wait_event(card->wait_q,  		   atomic_cmpxchg(&card->write.irq_pending, 0, 1) == 0);  	qeth_prepare_control_data(card, len, iob); -	QETH_DBF_TEXT(TRACE, 6, "osnoirqp"); +	QETH_CARD_TEXT(card, 6, "osnoirqp");  	spin_lock_irqsave(get_ccwdev_lock(card->write.ccwdev), flags);  	rc = ccw_device_start(card->write.ccwdev, &card->write.ccw,  			      (addr_t) iob, 0, 0); @@ -1194,7 +1196,7 @@ static int qeth_osn_send_control_data(struct qeth_card *card, int len,  	if (rc) {  		QETH_DBF_MESSAGE(2, "qeth_osn_send_control_data: "  			   "ccw_device_start rc = %i\n", rc); -		QETH_DBF_TEXT_(TRACE, 2, " err%d", rc); +		QETH_CARD_TEXT_(card, 2, " err%d", rc);  		qeth_release_buffer(iob->channel, iob);  		atomic_set(&card->write.irq_pending, 0);  		wake_up(&card->wait_q); @@ -1207,7 +1209,7 @@ static int qeth_osn_send_ipa_cmd(struct qeth_card *card,  {  	u16 s1, s2; -	QETH_DBF_TEXT(TRACE, 4, "osndipa"); +	QETH_CARD_TEXT(card, 4, "osndipa");  	qeth_prepare_ipa_cmd(card, iob, QETH_PROT_OSN2);  	s1 = (u16)(IPA_PDU_HEADER_SIZE + data_len); @@ -1225,12 +1227,12 @@ int qeth_osn_assist(struct net_device *dev, void *data, int data_len)  	struct qeth_card *card;  	int rc; -	QETH_DBF_TEXT(TRACE, 2, "osnsdmc");  	if (!dev)  		return -ENODEV;  	card = dev->ml_priv;  	if (!card)  		return -ENODEV; +	QETH_CARD_TEXT(card, 2, "osnsdmc");  	if ((card->state != CARD_STATE_UP) &&  	    (card->state != CARD_STATE_SOFTSETUP))  		return -ENODEV; @@ -1247,13 +1249,13 @@ int qeth_osn_register(unsigned char *read_dev_no, struct net_device **dev,  {  	struct qeth_card *card; -	QETH_DBF_TEXT(TRACE, 2, "osnreg");  	*dev = qeth_l2_netdev_by_devno(read_dev_no);  	if (*dev == NULL)  		return -ENODEV;  	card = (*dev)->ml_priv;  	if (!card)  		return -ENODEV; +	QETH_CARD_TEXT(card, 2, "osnreg");  	if ((assist_cb == NULL) || (data_cb == NULL))  		return -EINVAL;  	card->osn_info.assist_cb = assist_cb; @@ -1266,12 +1268,12 @@ void qeth_osn_deregister(struct net_device *dev)  {  	struct qeth_card *card; -	QETH_DBF_TEXT(TRACE, 2, "osndereg");  	if (!dev)  		return;  	card = dev->ml_priv;  	if (!card)  		return; +	QETH_CARD_TEXT(card, 2, "osndereg");  	card->osn_info.assist_cb = NULL;  	card->osn_info.data_cb = NULL;  	return;  |