mirror of
https://github.com/torvalds/linux.git
synced 2024-11-23 12:42:02 +00:00
Merge branch 's390-next'
Julian Wiedmann says: ==================== s390/qeth: updates 2021-07-20 please apply the following patch series for qeth to netdev's net-next tree. This removes the deprecated support for OSN-mode devices, and does some follow-on cleanups. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
c18e9405d4
@ -53,8 +53,6 @@ extern int ccwgroup_driver_register (struct ccwgroup_driver *cdriver);
|
||||
extern void ccwgroup_driver_unregister (struct ccwgroup_driver *cdriver);
|
||||
int ccwgroup_create_dev(struct device *root, struct ccwgroup_driver *gdrv,
|
||||
int num_devices, const char *buf);
|
||||
struct ccwgroup_device *get_ccwgroupdev_by_busid(struct ccwgroup_driver *gdrv,
|
||||
char *bus_id);
|
||||
|
||||
extern int ccwgroup_set_online(struct ccwgroup_device *gdev);
|
||||
extern int ccwgroup_set_offline(struct ccwgroup_device *gdev);
|
||||
|
@ -1160,12 +1160,12 @@ static int i40e_quiesce_vf_pci(struct i40e_vf *vf)
|
||||
}
|
||||
|
||||
/**
|
||||
* i40e_getnum_vf_vsi_vlan_filters
|
||||
* __i40e_getnum_vf_vsi_vlan_filters
|
||||
* @vsi: pointer to the vsi
|
||||
*
|
||||
* called to get the number of VLANs offloaded on this VF
|
||||
**/
|
||||
static int i40e_getnum_vf_vsi_vlan_filters(struct i40e_vsi *vsi)
|
||||
static int __i40e_getnum_vf_vsi_vlan_filters(struct i40e_vsi *vsi)
|
||||
{
|
||||
struct i40e_mac_filter *f;
|
||||
u16 num_vlans = 0, bkt;
|
||||
@ -1178,6 +1178,23 @@ static int i40e_getnum_vf_vsi_vlan_filters(struct i40e_vsi *vsi)
|
||||
return num_vlans;
|
||||
}
|
||||
|
||||
/**
|
||||
* i40e_getnum_vf_vsi_vlan_filters
|
||||
* @vsi: pointer to the vsi
|
||||
*
|
||||
* wrapper for __i40e_getnum_vf_vsi_vlan_filters() with spinlock held
|
||||
**/
|
||||
static int i40e_getnum_vf_vsi_vlan_filters(struct i40e_vsi *vsi)
|
||||
{
|
||||
int num_vlans;
|
||||
|
||||
spin_lock_bh(&vsi->mac_filter_hash_lock);
|
||||
num_vlans = __i40e_getnum_vf_vsi_vlan_filters(vsi);
|
||||
spin_unlock_bh(&vsi->mac_filter_hash_lock);
|
||||
|
||||
return num_vlans;
|
||||
}
|
||||
|
||||
/**
|
||||
* i40e_get_vlan_list_sync
|
||||
* @vsi: pointer to the VSI
|
||||
@ -1195,7 +1212,7 @@ static void i40e_get_vlan_list_sync(struct i40e_vsi *vsi, u16 *num_vlans,
|
||||
int bkt;
|
||||
|
||||
spin_lock_bh(&vsi->mac_filter_hash_lock);
|
||||
*num_vlans = i40e_getnum_vf_vsi_vlan_filters(vsi);
|
||||
*num_vlans = __i40e_getnum_vf_vsi_vlan_filters(vsi);
|
||||
*vlan_list = kcalloc(*num_vlans, sizeof(**vlan_list), GFP_ATOMIC);
|
||||
if (!(*vlan_list))
|
||||
goto err;
|
||||
|
@ -131,6 +131,30 @@ enum iavf_status iavf_free_virt_mem_d(struct iavf_hw *hw,
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* iavf_lock_timeout - try to set bit but give up after timeout
|
||||
* @adapter: board private structure
|
||||
* @bit: bit to set
|
||||
* @msecs: timeout in msecs
|
||||
*
|
||||
* Returns 0 on success, negative on failure
|
||||
**/
|
||||
static int iavf_lock_timeout(struct iavf_adapter *adapter,
|
||||
enum iavf_critical_section_t bit,
|
||||
unsigned int msecs)
|
||||
{
|
||||
unsigned int wait, delay = 10;
|
||||
|
||||
for (wait = 0; wait < msecs; wait += delay) {
|
||||
if (!test_and_set_bit(bit, &adapter->crit_section))
|
||||
return 0;
|
||||
|
||||
msleep(delay);
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
/**
|
||||
* iavf_schedule_reset - Set the flags and schedule a reset event
|
||||
* @adapter: board private structure
|
||||
@ -1988,7 +2012,6 @@ static void iavf_watchdog_task(struct work_struct *work)
|
||||
/* check for hw reset */
|
||||
reg_val = rd32(hw, IAVF_VF_ARQLEN1) & IAVF_VF_ARQLEN1_ARQENABLE_MASK;
|
||||
if (!reg_val) {
|
||||
adapter->state = __IAVF_RESETTING;
|
||||
adapter->flags |= IAVF_FLAG_RESET_PENDING;
|
||||
adapter->aq_required = 0;
|
||||
adapter->current_op = VIRTCHNL_OP_UNKNOWN;
|
||||
@ -2102,6 +2125,10 @@ static void iavf_reset_task(struct work_struct *work)
|
||||
if (test_bit(__IAVF_IN_REMOVE_TASK, &adapter->crit_section))
|
||||
return;
|
||||
|
||||
if (iavf_lock_timeout(adapter, __IAVF_IN_CRITICAL_TASK, 200)) {
|
||||
schedule_work(&adapter->reset_task);
|
||||
return;
|
||||
}
|
||||
while (test_and_set_bit(__IAVF_IN_CLIENT_TASK,
|
||||
&adapter->crit_section))
|
||||
usleep_range(500, 1000);
|
||||
@ -2308,6 +2335,8 @@ static void iavf_adminq_task(struct work_struct *work)
|
||||
if (!event.msg_buf)
|
||||
goto out;
|
||||
|
||||
if (iavf_lock_timeout(adapter, __IAVF_IN_CRITICAL_TASK, 200))
|
||||
goto freedom;
|
||||
do {
|
||||
ret = iavf_clean_arq_element(hw, &event, &pending);
|
||||
v_op = (enum virtchnl_ops)le32_to_cpu(event.desc.cookie_high);
|
||||
@ -2321,6 +2350,7 @@ static void iavf_adminq_task(struct work_struct *work)
|
||||
if (pending != 0)
|
||||
memset(event.msg_buf, 0, IAVF_MAX_AQ_BUF_SIZE);
|
||||
} while (pending);
|
||||
clear_bit(__IAVF_IN_CRITICAL_TASK, &adapter->crit_section);
|
||||
|
||||
if ((adapter->flags &
|
||||
(IAVF_FLAG_RESET_PENDING | IAVF_FLAG_RESET_NEEDED)) ||
|
||||
@ -3625,6 +3655,10 @@ static void iavf_init_task(struct work_struct *work)
|
||||
init_task.work);
|
||||
struct iavf_hw *hw = &adapter->hw;
|
||||
|
||||
if (iavf_lock_timeout(adapter, __IAVF_IN_CRITICAL_TASK, 5000)) {
|
||||
dev_warn(&adapter->pdev->dev, "failed to set __IAVF_IN_CRITICAL_TASK in %s\n", __FUNCTION__);
|
||||
return;
|
||||
}
|
||||
switch (adapter->state) {
|
||||
case __IAVF_STARTUP:
|
||||
if (iavf_startup(adapter) < 0)
|
||||
@ -3637,14 +3671,14 @@ static void iavf_init_task(struct work_struct *work)
|
||||
case __IAVF_INIT_GET_RESOURCES:
|
||||
if (iavf_init_get_resources(adapter) < 0)
|
||||
goto init_failed;
|
||||
return;
|
||||
goto out;
|
||||
default:
|
||||
goto init_failed;
|
||||
}
|
||||
|
||||
queue_delayed_work(iavf_wq, &adapter->init_task,
|
||||
msecs_to_jiffies(30));
|
||||
return;
|
||||
goto out;
|
||||
init_failed:
|
||||
if (++adapter->aq_wait_count > IAVF_AQ_MAX_ERR) {
|
||||
dev_err(&adapter->pdev->dev,
|
||||
@ -3653,9 +3687,11 @@ init_failed:
|
||||
iavf_shutdown_adminq(hw);
|
||||
adapter->state = __IAVF_STARTUP;
|
||||
queue_delayed_work(iavf_wq, &adapter->init_task, HZ * 5);
|
||||
return;
|
||||
goto out;
|
||||
}
|
||||
queue_delayed_work(iavf_wq, &adapter->init_task, HZ);
|
||||
out:
|
||||
clear_bit(__IAVF_IN_CRITICAL_TASK, &adapter->crit_section);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -3672,9 +3708,12 @@ static void iavf_shutdown(struct pci_dev *pdev)
|
||||
if (netif_running(netdev))
|
||||
iavf_close(netdev);
|
||||
|
||||
if (iavf_lock_timeout(adapter, __IAVF_IN_CRITICAL_TASK, 5000))
|
||||
dev_warn(&adapter->pdev->dev, "failed to set __IAVF_IN_CRITICAL_TASK in %s\n", __FUNCTION__);
|
||||
/* Prevent the watchdog from running. */
|
||||
adapter->state = __IAVF_REMOVE;
|
||||
adapter->aq_required = 0;
|
||||
clear_bit(__IAVF_IN_CRITICAL_TASK, &adapter->crit_section);
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
pci_save_state(pdev);
|
||||
@ -3908,10 +3947,6 @@ static void iavf_remove(struct pci_dev *pdev)
|
||||
err);
|
||||
}
|
||||
|
||||
/* Shut down all the garbage mashers on the detention level */
|
||||
adapter->state = __IAVF_REMOVE;
|
||||
adapter->aq_required = 0;
|
||||
adapter->flags &= ~IAVF_FLAG_REINIT_ITR_NEEDED;
|
||||
iavf_request_reset(adapter);
|
||||
msleep(50);
|
||||
/* If the FW isn't responding, kick it once, but only once. */
|
||||
@ -3919,6 +3954,13 @@ static void iavf_remove(struct pci_dev *pdev)
|
||||
iavf_request_reset(adapter);
|
||||
msleep(50);
|
||||
}
|
||||
if (iavf_lock_timeout(adapter, __IAVF_IN_CRITICAL_TASK, 5000))
|
||||
dev_warn(&adapter->pdev->dev, "failed to set __IAVF_IN_CRITICAL_TASK in %s\n", __FUNCTION__);
|
||||
|
||||
/* Shut down all the garbage mashers on the detention level */
|
||||
adapter->state = __IAVF_REMOVE;
|
||||
adapter->aq_required = 0;
|
||||
adapter->flags &= ~IAVF_FLAG_REINIT_ITR_NEEDED;
|
||||
iavf_free_all_tx_resources(adapter);
|
||||
iavf_free_all_rx_resources(adapter);
|
||||
iavf_misc_irq_disable(adapter);
|
||||
|
@ -503,28 +503,6 @@ void ccwgroup_driver_unregister(struct ccwgroup_driver *cdriver)
|
||||
}
|
||||
EXPORT_SYMBOL(ccwgroup_driver_unregister);
|
||||
|
||||
/**
|
||||
* get_ccwgroupdev_by_busid() - obtain device from a bus id
|
||||
* @gdrv: driver the device is owned by
|
||||
* @bus_id: bus id of the device to be searched
|
||||
*
|
||||
* This function searches all devices owned by @gdrv for a device with a bus
|
||||
* id matching @bus_id.
|
||||
* Returns:
|
||||
* If a match is found, its reference count of the found device is increased
|
||||
* and it is returned; else %NULL is returned.
|
||||
*/
|
||||
struct ccwgroup_device *get_ccwgroupdev_by_busid(struct ccwgroup_driver *gdrv,
|
||||
char *bus_id)
|
||||
{
|
||||
struct device *dev;
|
||||
|
||||
dev = driver_find_device_by_name(&gdrv->driver, bus_id);
|
||||
|
||||
return dev ? to_ccwgroupdev(dev) : NULL;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(get_ccwgroupdev_by_busid);
|
||||
|
||||
/**
|
||||
* ccwgroup_probe_ccwdev() - probe function for slave devices
|
||||
* @cdev: ccw device to be probed
|
||||
|
@ -88,15 +88,6 @@ config QETH_L3
|
||||
To compile as a module choose M. The module name is qeth_l3.
|
||||
If unsure, choose Y.
|
||||
|
||||
config QETH_OSN
|
||||
def_bool !HAVE_MARCH_Z14_FEATURES
|
||||
prompt "qeth OSN device support"
|
||||
depends on QETH
|
||||
help
|
||||
This enables the qeth driver to support devices in OSN mode.
|
||||
This feature will be removed in 2021.
|
||||
If unsure, choose N.
|
||||
|
||||
config QETH_OSX
|
||||
def_bool !HAVE_MARCH_Z15_FEATURES
|
||||
prompt "qeth OSX device support"
|
||||
|
@ -259,22 +259,10 @@ struct qeth_hdr_layer2 {
|
||||
__u8 reserved2[16];
|
||||
} __attribute__ ((packed));
|
||||
|
||||
struct qeth_hdr_osn {
|
||||
__u8 id;
|
||||
__u8 reserved;
|
||||
__u16 seq_no;
|
||||
__u16 reserved2;
|
||||
__u16 control_flags;
|
||||
__u16 pdu_length;
|
||||
__u8 reserved3[18];
|
||||
__u32 ccid;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
struct qeth_hdr {
|
||||
union {
|
||||
struct qeth_hdr_layer2 l2;
|
||||
struct qeth_hdr_layer3 l3;
|
||||
struct qeth_hdr_osn osn;
|
||||
} hdr;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
@ -341,7 +329,6 @@ enum qeth_header_ids {
|
||||
QETH_HEADER_TYPE_LAYER3 = 0x01,
|
||||
QETH_HEADER_TYPE_LAYER2 = 0x02,
|
||||
QETH_HEADER_TYPE_L3_TSO = 0x03,
|
||||
QETH_HEADER_TYPE_OSN = 0x04,
|
||||
QETH_HEADER_TYPE_L2_TSO = 0x06,
|
||||
QETH_HEADER_MASK_INVAL = 0x80,
|
||||
};
|
||||
@ -779,13 +766,7 @@ enum qeth_threads {
|
||||
QETH_RECOVER_THREAD = 1,
|
||||
};
|
||||
|
||||
struct qeth_osn_info {
|
||||
int (*assist_cb)(struct net_device *dev, void *data);
|
||||
int (*data_cb)(struct sk_buff *skb);
|
||||
};
|
||||
|
||||
struct qeth_discipline {
|
||||
const struct device_type *devtype;
|
||||
int (*setup) (struct ccwgroup_device *);
|
||||
void (*remove) (struct ccwgroup_device *);
|
||||
int (*set_online)(struct qeth_card *card, bool carrier_ok);
|
||||
@ -865,7 +846,6 @@ struct qeth_card {
|
||||
/* QDIO buffer handling */
|
||||
struct qeth_qdio_info qdio;
|
||||
int read_or_write_problem;
|
||||
struct qeth_osn_info osn_info;
|
||||
const struct qeth_discipline *discipline;
|
||||
atomic_t force_alloc_skb;
|
||||
struct service_level qeth_service_level;
|
||||
@ -1058,10 +1038,7 @@ int qeth_get_priority_queue(struct qeth_card *card, struct sk_buff *skb);
|
||||
extern const struct qeth_discipline qeth_l2_discipline;
|
||||
extern const struct qeth_discipline qeth_l3_discipline;
|
||||
extern const struct ethtool_ops qeth_ethtool_ops;
|
||||
extern const struct ethtool_ops qeth_osn_ethtool_ops;
|
||||
extern const struct attribute_group *qeth_dev_groups[];
|
||||
extern const struct attribute_group *qeth_osn_dev_groups[];
|
||||
extern const struct device_type qeth_generic_devtype;
|
||||
|
||||
const char *qeth_get_cardname_short(struct qeth_card *);
|
||||
int qeth_resize_buffer_pool(struct qeth_card *card, unsigned int count);
|
||||
@ -1069,11 +1046,9 @@ int qeth_setup_discipline(struct qeth_card *card, enum qeth_discipline_id disc);
|
||||
void qeth_remove_discipline(struct qeth_card *card);
|
||||
|
||||
/* exports for qeth discipline device drivers */
|
||||
extern struct kmem_cache *qeth_core_header_cache;
|
||||
extern struct qeth_dbf_info qeth_dbf[QETH_DBF_INFOS];
|
||||
|
||||
struct net_device *qeth_clone_netdev(struct net_device *orig);
|
||||
struct qeth_card *qeth_get_card_by_busid(char *bus_id);
|
||||
void qeth_set_allowed_threads(struct qeth_card *card, unsigned long threads,
|
||||
int clear_start_mask);
|
||||
int qeth_threads_running(struct qeth_card *, unsigned long);
|
||||
@ -1088,9 +1063,6 @@ struct qeth_cmd_buffer *qeth_ipa_alloc_cmd(struct qeth_card *card,
|
||||
enum qeth_ipa_cmds cmd_code,
|
||||
enum qeth_prot_versions prot,
|
||||
unsigned int data_length);
|
||||
struct qeth_cmd_buffer *qeth_alloc_cmd(struct qeth_channel *channel,
|
||||
unsigned int length, unsigned int ccws,
|
||||
long timeout);
|
||||
struct qeth_cmd_buffer *qeth_get_setassparms_cmd(struct qeth_card *card,
|
||||
enum qeth_ipa_funcs ipa_func,
|
||||
u16 cmd_code,
|
||||
@ -1099,18 +1071,12 @@ struct qeth_cmd_buffer *qeth_get_setassparms_cmd(struct qeth_card *card,
|
||||
struct qeth_cmd_buffer *qeth_get_diag_cmd(struct qeth_card *card,
|
||||
enum qeth_diags_cmds sub_cmd,
|
||||
unsigned int data_length);
|
||||
void qeth_notify_cmd(struct qeth_cmd_buffer *iob, int reason);
|
||||
void qeth_put_cmd(struct qeth_cmd_buffer *iob);
|
||||
|
||||
int qeth_schedule_recovery(struct qeth_card *card);
|
||||
int qeth_poll(struct napi_struct *napi, int budget);
|
||||
void qeth_setadp_promisc_mode(struct qeth_card *card, bool enable);
|
||||
int qeth_setadpparms_change_macaddr(struct qeth_card *);
|
||||
void qeth_tx_timeout(struct net_device *, unsigned int txqueue);
|
||||
void qeth_prepare_ipa_cmd(struct qeth_card *card, struct qeth_cmd_buffer *iob,
|
||||
u16 cmd_length,
|
||||
bool (*match)(struct qeth_cmd_buffer *iob,
|
||||
struct qeth_cmd_buffer *reply));
|
||||
int qeth_query_switch_attributes(struct qeth_card *card,
|
||||
struct qeth_switch_info *sw_info);
|
||||
int qeth_query_card_info(struct qeth_card *card,
|
||||
@ -1118,11 +1084,6 @@ int qeth_query_card_info(struct qeth_card *card,
|
||||
int qeth_setadpparms_set_access_ctrl(struct qeth_card *card,
|
||||
enum qeth_ipa_isolation_modes mode);
|
||||
|
||||
unsigned int qeth_count_elements(struct sk_buff *skb, unsigned int data_offset);
|
||||
int qeth_do_send_packet(struct qeth_card *card, struct qeth_qdio_out_q *queue,
|
||||
struct sk_buff *skb, struct qeth_hdr *hdr,
|
||||
unsigned int offset, unsigned int hd_len,
|
||||
int elements_needed);
|
||||
int qeth_do_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
|
||||
void qeth_dbf_longtext(debug_info_t *id, int level, char *text, ...);
|
||||
int qeth_configure_cq(struct qeth_card *, enum qeth_cq);
|
||||
@ -1148,11 +1109,4 @@ int qeth_xmit(struct qeth_card *card, struct sk_buff *skb,
|
||||
struct qeth_hdr *hdr, struct sk_buff *skb,
|
||||
__be16 proto, unsigned int data_len));
|
||||
|
||||
/* exports for OSN */
|
||||
int qeth_osn_assist(struct net_device *, void *, int);
|
||||
int qeth_osn_register(unsigned char *read_dev_no, struct net_device **,
|
||||
int (*assist_cb)(struct net_device *, void *),
|
||||
int (*data_cb)(struct sk_buff *));
|
||||
void qeth_osn_deregister(struct net_device *);
|
||||
|
||||
#endif /* __QETH_CORE_H__ */
|
||||
|
@ -57,8 +57,7 @@ struct qeth_dbf_info qeth_dbf[QETH_DBF_INFOS] = {
|
||||
};
|
||||
EXPORT_SYMBOL_GPL(qeth_dbf);
|
||||
|
||||
struct kmem_cache *qeth_core_header_cache;
|
||||
EXPORT_SYMBOL_GPL(qeth_core_header_cache);
|
||||
static struct kmem_cache *qeth_core_header_cache;
|
||||
static struct kmem_cache *qeth_qdio_outbuf_cache;
|
||||
|
||||
static struct device *qeth_core_root_dev;
|
||||
@ -101,8 +100,6 @@ static const char *qeth_get_cardname(struct qeth_card *card)
|
||||
return " OSD Express";
|
||||
case QETH_CARD_TYPE_IQD:
|
||||
return " HiperSockets";
|
||||
case QETH_CARD_TYPE_OSN:
|
||||
return " OSN QDIO";
|
||||
case QETH_CARD_TYPE_OSM:
|
||||
return " OSM QDIO";
|
||||
case QETH_CARD_TYPE_OSX:
|
||||
@ -157,8 +154,6 @@ const char *qeth_get_cardname_short(struct qeth_card *card)
|
||||
}
|
||||
case QETH_CARD_TYPE_IQD:
|
||||
return "HiperSockets";
|
||||
case QETH_CARD_TYPE_OSN:
|
||||
return "OSN";
|
||||
case QETH_CARD_TYPE_OSM:
|
||||
return "OSM_1000";
|
||||
case QETH_CARD_TYPE_OSX:
|
||||
@ -431,6 +426,13 @@ static enum iucv_tx_notify qeth_compute_cq_notification(int sbalf15,
|
||||
return n;
|
||||
}
|
||||
|
||||
static void qeth_put_cmd(struct qeth_cmd_buffer *iob)
|
||||
{
|
||||
if (refcount_dec_and_test(&iob->ref_count)) {
|
||||
kfree(iob->data);
|
||||
kfree(iob);
|
||||
}
|
||||
}
|
||||
static void qeth_setup_ccw(struct ccw1 *ccw, u8 cmd_code, u8 flags, u32 len,
|
||||
void *data)
|
||||
{
|
||||
@ -499,12 +501,11 @@ static void qeth_dequeue_cmd(struct qeth_card *card,
|
||||
spin_unlock_irq(&card->lock);
|
||||
}
|
||||
|
||||
void qeth_notify_cmd(struct qeth_cmd_buffer *iob, int reason)
|
||||
static void qeth_notify_cmd(struct qeth_cmd_buffer *iob, int reason)
|
||||
{
|
||||
iob->rc = reason;
|
||||
complete(&iob->done);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(qeth_notify_cmd);
|
||||
|
||||
static void qeth_flush_local_addrs4(struct qeth_card *card)
|
||||
{
|
||||
@ -781,10 +782,7 @@ static struct qeth_ipa_cmd *qeth_check_ipa_data(struct qeth_card *card,
|
||||
QETH_CARD_TEXT(card, 5, "chkipad");
|
||||
|
||||
if (IS_IPA_REPLY(cmd)) {
|
||||
if (cmd->hdr.command != IPA_CMD_SETCCID &&
|
||||
cmd->hdr.command != IPA_CMD_DELCCID &&
|
||||
cmd->hdr.command != IPA_CMD_MODCCID &&
|
||||
cmd->hdr.command != IPA_CMD_SET_DIAG_ASS)
|
||||
if (cmd->hdr.command != IPA_CMD_SET_DIAG_ASS)
|
||||
qeth_issue_ipa_msg(cmd, cmd->hdr.return_code, card);
|
||||
return cmd;
|
||||
}
|
||||
@ -819,8 +817,6 @@ static struct qeth_ipa_cmd *qeth_check_ipa_data(struct qeth_card *card,
|
||||
if (card->discipline->control_event_handler(card, cmd))
|
||||
return cmd;
|
||||
return NULL;
|
||||
case IPA_CMD_MODCCID:
|
||||
return cmd;
|
||||
case IPA_CMD_REGISTER_LOCAL_ADDR:
|
||||
if (cmd->hdr.prot_version == QETH_PROT_IPV4)
|
||||
qeth_add_local_addrs4(card, &cmd->data.local_addrs4);
|
||||
@ -877,15 +873,6 @@ static int qeth_check_idx_response(struct qeth_card *card,
|
||||
return 0;
|
||||
}
|
||||
|
||||
void qeth_put_cmd(struct qeth_cmd_buffer *iob)
|
||||
{
|
||||
if (refcount_dec_and_test(&iob->ref_count)) {
|
||||
kfree(iob->data);
|
||||
kfree(iob);
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(qeth_put_cmd);
|
||||
|
||||
static void qeth_release_buffer_cb(struct qeth_card *card,
|
||||
struct qeth_cmd_buffer *iob,
|
||||
unsigned int data_length)
|
||||
@ -899,9 +886,9 @@ static void qeth_cancel_cmd(struct qeth_cmd_buffer *iob, int rc)
|
||||
qeth_put_cmd(iob);
|
||||
}
|
||||
|
||||
struct qeth_cmd_buffer *qeth_alloc_cmd(struct qeth_channel *channel,
|
||||
unsigned int length, unsigned int ccws,
|
||||
long timeout)
|
||||
static struct qeth_cmd_buffer *qeth_alloc_cmd(struct qeth_channel *channel,
|
||||
unsigned int length,
|
||||
unsigned int ccws, long timeout)
|
||||
{
|
||||
struct qeth_cmd_buffer *iob;
|
||||
|
||||
@ -927,7 +914,6 @@ struct qeth_cmd_buffer *qeth_alloc_cmd(struct qeth_channel *channel,
|
||||
iob->length = length;
|
||||
return iob;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(qeth_alloc_cmd);
|
||||
|
||||
static void qeth_issue_next_read_cb(struct qeth_card *card,
|
||||
struct qeth_cmd_buffer *iob,
|
||||
@ -958,11 +944,6 @@ static void qeth_issue_next_read_cb(struct qeth_card *card,
|
||||
cmd = qeth_check_ipa_data(card, cmd);
|
||||
if (!cmd)
|
||||
goto out;
|
||||
if (IS_OSN(card) && card->osn_info.assist_cb &&
|
||||
cmd->hdr.command != IPA_CMD_STARTLAN) {
|
||||
card->osn_info.assist_cb(card->dev, cmd);
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
|
||||
/* match against pending cmd requests */
|
||||
@ -1835,7 +1816,7 @@ static enum qeth_discipline_id qeth_enforce_discipline(struct qeth_card *card)
|
||||
{
|
||||
enum qeth_discipline_id disc = QETH_DISCIPLINE_UNDETERMINED;
|
||||
|
||||
if (IS_OSM(card) || IS_OSN(card))
|
||||
if (IS_OSM(card))
|
||||
disc = QETH_DISCIPLINE_LAYER2;
|
||||
else if (IS_VM_NIC(card))
|
||||
disc = IS_IQD(card) ? QETH_DISCIPLINE_LAYER3 :
|
||||
@ -1885,7 +1866,6 @@ static void qeth_idx_init(struct qeth_card *card)
|
||||
card->info.func_level = QETH_IDX_FUNC_LEVEL_IQD;
|
||||
break;
|
||||
case QETH_CARD_TYPE_OSD:
|
||||
case QETH_CARD_TYPE_OSN:
|
||||
card->info.func_level = QETH_IDX_FUNC_LEVEL_OSD;
|
||||
break;
|
||||
default:
|
||||
@ -2442,9 +2422,7 @@ static int qeth_ulp_enable_cb(struct qeth_card *card, struct qeth_reply *reply,
|
||||
|
||||
static u8 qeth_mpc_select_prot_type(struct qeth_card *card)
|
||||
{
|
||||
if (IS_OSN(card))
|
||||
return QETH_PROT_OSN2;
|
||||
return IS_LAYER2(card) ? QETH_PROT_LAYER2 : QETH_PROT_TCPIP;
|
||||
return IS_LAYER2(card) ? QETH_MPC_PROT_L2 : QETH_MPC_PROT_L3;
|
||||
}
|
||||
|
||||
static int qeth_ulp_enable(struct qeth_card *card)
|
||||
@ -3000,10 +2978,8 @@ static void qeth_ipa_finalize_cmd(struct qeth_card *card,
|
||||
__ipa_cmd(iob)->hdr.seqno = card->seqno.ipa++;
|
||||
}
|
||||
|
||||
void qeth_prepare_ipa_cmd(struct qeth_card *card, struct qeth_cmd_buffer *iob,
|
||||
u16 cmd_length,
|
||||
bool (*match)(struct qeth_cmd_buffer *iob,
|
||||
struct qeth_cmd_buffer *reply))
|
||||
static void qeth_prepare_ipa_cmd(struct qeth_card *card,
|
||||
struct qeth_cmd_buffer *iob, u16 cmd_length)
|
||||
{
|
||||
u8 prot_type = qeth_mpc_select_prot_type(card);
|
||||
u16 total_length = iob->length;
|
||||
@ -3011,7 +2987,6 @@ void qeth_prepare_ipa_cmd(struct qeth_card *card, struct qeth_cmd_buffer *iob,
|
||||
qeth_setup_ccw(__ccw_from_cmd(iob), CCW_CMD_WRITE, 0, total_length,
|
||||
iob->data);
|
||||
iob->finalize = qeth_ipa_finalize_cmd;
|
||||
iob->match = match;
|
||||
|
||||
memcpy(iob->data, IPA_PDU_HEADER, IPA_PDU_HEADER_SIZE);
|
||||
memcpy(QETH_IPA_PDU_LEN_TOTAL(iob->data), &total_length, 2);
|
||||
@ -3022,7 +2997,6 @@ void qeth_prepare_ipa_cmd(struct qeth_card *card, struct qeth_cmd_buffer *iob,
|
||||
&card->token.ulp_connection_r, QETH_MPC_TOKEN_LENGTH);
|
||||
memcpy(QETH_IPA_PDU_LEN_PDU3(iob->data), &cmd_length, 2);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(qeth_prepare_ipa_cmd);
|
||||
|
||||
static bool qeth_ipa_match_reply(struct qeth_cmd_buffer *iob,
|
||||
struct qeth_cmd_buffer *reply)
|
||||
@ -3046,7 +3020,8 @@ struct qeth_cmd_buffer *qeth_ipa_alloc_cmd(struct qeth_card *card,
|
||||
if (!iob)
|
||||
return NULL;
|
||||
|
||||
qeth_prepare_ipa_cmd(card, iob, data_length, qeth_ipa_match_reply);
|
||||
qeth_prepare_ipa_cmd(card, iob, data_length);
|
||||
iob->match = qeth_ipa_match_reply;
|
||||
|
||||
hdr = &__ipa_cmd(iob)->hdr;
|
||||
hdr->command = cmd_code;
|
||||
@ -3894,7 +3869,8 @@ static int qeth_get_elements_for_frags(struct sk_buff *skb)
|
||||
* Returns the number of pages, and thus QDIO buffer elements, needed to map the
|
||||
* skb's data (both its linear part and paged fragments).
|
||||
*/
|
||||
unsigned int qeth_count_elements(struct sk_buff *skb, unsigned int data_offset)
|
||||
static unsigned int qeth_count_elements(struct sk_buff *skb,
|
||||
unsigned int data_offset)
|
||||
{
|
||||
unsigned int elements = qeth_get_elements_for_frags(skb);
|
||||
addr_t end = (addr_t)skb->data + skb_headlen(skb);
|
||||
@ -3904,7 +3880,6 @@ unsigned int qeth_count_elements(struct sk_buff *skb, unsigned int data_offset)
|
||||
elements += qeth_get_elements_for_range(start, end);
|
||||
return elements;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(qeth_count_elements);
|
||||
|
||||
#define QETH_HDR_CACHE_OBJ_SIZE (sizeof(struct qeth_hdr_tso) + \
|
||||
MAX_TCP_HEADER)
|
||||
@ -4192,10 +4167,11 @@ static int __qeth_xmit(struct qeth_card *card, struct qeth_qdio_out_q *queue,
|
||||
return 0;
|
||||
}
|
||||
|
||||
int qeth_do_send_packet(struct qeth_card *card, struct qeth_qdio_out_q *queue,
|
||||
struct sk_buff *skb, struct qeth_hdr *hdr,
|
||||
unsigned int offset, unsigned int hd_len,
|
||||
int elements_needed)
|
||||
static int qeth_do_send_packet(struct qeth_card *card,
|
||||
struct qeth_qdio_out_q *queue,
|
||||
struct sk_buff *skb, struct qeth_hdr *hdr,
|
||||
unsigned int offset, unsigned int hd_len,
|
||||
unsigned int elements_needed)
|
||||
{
|
||||
unsigned int start_index = queue->next_buf_to_fill;
|
||||
struct qeth_qdio_out_buffer *buffer;
|
||||
@ -4275,7 +4251,6 @@ out:
|
||||
netif_tx_start_queue(txq);
|
||||
return rc;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(qeth_do_send_packet);
|
||||
|
||||
static void qeth_fill_tso_ext(struct qeth_hdr_tso *hdr,
|
||||
unsigned int payload_len, struct sk_buff *skb,
|
||||
@ -4554,7 +4529,6 @@ static int qeth_mdio_read(struct net_device *dev, int phy_id, int regnum)
|
||||
case MII_BMCR: /* Basic mode control register */
|
||||
rc = BMCR_FULLDPLX;
|
||||
if ((card->info.link_type != QETH_LINK_TYPE_GBIT_ETH) &&
|
||||
(card->info.link_type != QETH_LINK_TYPE_OSN) &&
|
||||
(card->info.link_type != QETH_LINK_TYPE_10GBIT_ETH) &&
|
||||
(card->info.link_type != QETH_LINK_TYPE_25GBIT_ETH))
|
||||
rc |= BMCR_SPEED100;
|
||||
@ -5266,10 +5240,6 @@ static struct ccw_device_id qeth_ids[] = {
|
||||
.driver_info = QETH_CARD_TYPE_OSD},
|
||||
{CCW_DEVICE_DEVTYPE(0x1731, 0x05, 0x1732, 0x05),
|
||||
.driver_info = QETH_CARD_TYPE_IQD},
|
||||
#ifdef CONFIG_QETH_OSN
|
||||
{CCW_DEVICE_DEVTYPE(0x1731, 0x06, 0x1732, 0x06),
|
||||
.driver_info = QETH_CARD_TYPE_OSN},
|
||||
#endif
|
||||
{CCW_DEVICE_DEVTYPE(0x1731, 0x02, 0x1732, 0x03),
|
||||
.driver_info = QETH_CARD_TYPE_OSM},
|
||||
#ifdef CONFIG_QETH_OSX
|
||||
@ -5628,14 +5598,6 @@ static void qeth_receive_skb(struct qeth_card *card, struct sk_buff *skb,
|
||||
bool is_cso;
|
||||
|
||||
switch (hdr->hdr.l2.id) {
|
||||
case QETH_HEADER_TYPE_OSN:
|
||||
skb_push(skb, sizeof(*hdr));
|
||||
skb_copy_to_linear_data(skb, hdr, sizeof(*hdr));
|
||||
QETH_CARD_STAT_ADD(card, rx_bytes, skb->len);
|
||||
QETH_CARD_STAT_INC(card, rx_packets);
|
||||
|
||||
card->osn_info.data_cb(skb);
|
||||
return;
|
||||
#if IS_ENABLED(CONFIG_QETH_L3)
|
||||
case QETH_HEADER_TYPE_LAYER3:
|
||||
qeth_l3_rebuild_skb(card, skb, hdr);
|
||||
@ -5750,16 +5712,6 @@ next_packet:
|
||||
linear_len = sizeof(struct iphdr);
|
||||
headroom = ETH_HLEN;
|
||||
break;
|
||||
case QETH_HEADER_TYPE_OSN:
|
||||
skb_len = hdr->hdr.osn.pdu_length;
|
||||
if (!IS_OSN(card)) {
|
||||
QETH_CARD_STAT_INC(card, rx_dropped_notsupp);
|
||||
goto walk_packet;
|
||||
}
|
||||
|
||||
linear_len = skb_len;
|
||||
headroom = sizeof(struct qeth_hdr);
|
||||
break;
|
||||
default:
|
||||
if (hdr->hdr.l2.id & QETH_HEADER_MASK_INVAL)
|
||||
QETH_CARD_STAT_INC(card, rx_frame_errors);
|
||||
@ -5777,8 +5729,7 @@ next_packet:
|
||||
|
||||
use_rx_sg = (card->options.cq == QETH_CQ_ENABLED) ||
|
||||
(skb_len > READ_ONCE(priv->rx_copybreak) &&
|
||||
!atomic_read(&card->force_alloc_skb) &&
|
||||
!IS_OSN(card));
|
||||
!atomic_read(&card->force_alloc_skb));
|
||||
|
||||
if (use_rx_sg) {
|
||||
/* QETH_CQ_ENABLED only: */
|
||||
@ -6335,14 +6286,9 @@ void qeth_remove_discipline(struct qeth_card *card)
|
||||
card->discipline = NULL;
|
||||
}
|
||||
|
||||
const struct device_type qeth_generic_devtype = {
|
||||
static const struct device_type qeth_generic_devtype = {
|
||||
.name = "qeth_generic",
|
||||
};
|
||||
EXPORT_SYMBOL_GPL(qeth_generic_devtype);
|
||||
|
||||
static const struct device_type qeth_osn_devtype = {
|
||||
.name = "qeth_osn",
|
||||
};
|
||||
|
||||
#define DBF_NAME_LEN 20
|
||||
|
||||
@ -6425,10 +6371,6 @@ static struct net_device *qeth_alloc_netdev(struct qeth_card *card)
|
||||
case QETH_CARD_TYPE_OSM:
|
||||
dev = alloc_etherdev(sizeof(*priv));
|
||||
break;
|
||||
case QETH_CARD_TYPE_OSN:
|
||||
dev = alloc_netdev(sizeof(*priv), "osn%d", NET_NAME_UNKNOWN,
|
||||
ether_setup);
|
||||
break;
|
||||
default:
|
||||
dev = alloc_etherdev_mqs(sizeof(*priv), QETH_MAX_OUT_QUEUES, 1);
|
||||
}
|
||||
@ -6442,23 +6384,19 @@ static struct net_device *qeth_alloc_netdev(struct qeth_card *card)
|
||||
|
||||
dev->ml_priv = card;
|
||||
dev->watchdog_timeo = QETH_TX_TIMEOUT;
|
||||
dev->min_mtu = IS_OSN(card) ? 64 : 576;
|
||||
dev->min_mtu = 576;
|
||||
/* initialized when device first goes online: */
|
||||
dev->max_mtu = 0;
|
||||
dev->mtu = 0;
|
||||
SET_NETDEV_DEV(dev, &card->gdev->dev);
|
||||
netif_carrier_off(dev);
|
||||
|
||||
if (IS_OSN(card)) {
|
||||
dev->ethtool_ops = &qeth_osn_ethtool_ops;
|
||||
} else {
|
||||
dev->ethtool_ops = &qeth_ethtool_ops;
|
||||
dev->priv_flags &= ~IFF_TX_SKB_SHARING;
|
||||
dev->hw_features |= NETIF_F_SG;
|
||||
dev->vlan_features |= NETIF_F_SG;
|
||||
if (IS_IQD(card))
|
||||
dev->features |= NETIF_F_SG;
|
||||
}
|
||||
dev->ethtool_ops = &qeth_ethtool_ops;
|
||||
dev->priv_flags &= ~IFF_TX_SKB_SHARING;
|
||||
dev->hw_features |= NETIF_F_SG;
|
||||
dev->vlan_features |= NETIF_F_SG;
|
||||
if (IS_IQD(card))
|
||||
dev->features |= NETIF_F_SG;
|
||||
|
||||
return dev;
|
||||
}
|
||||
@ -6521,10 +6459,7 @@ static int qeth_core_probe_device(struct ccwgroup_device *gdev)
|
||||
if (rc)
|
||||
goto err_chp_desc;
|
||||
|
||||
if (IS_OSN(card))
|
||||
gdev->dev.groups = qeth_osn_dev_groups;
|
||||
else
|
||||
gdev->dev.groups = qeth_dev_groups;
|
||||
gdev->dev.groups = qeth_dev_groups;
|
||||
|
||||
enforced_disc = qeth_enforce_discipline(card);
|
||||
switch (enforced_disc) {
|
||||
@ -6538,8 +6473,6 @@ static int qeth_core_probe_device(struct ccwgroup_device *gdev)
|
||||
if (rc)
|
||||
goto err_setup_disc;
|
||||
|
||||
gdev->dev.type = IS_OSN(card) ? &qeth_osn_devtype :
|
||||
card->discipline->devtype;
|
||||
break;
|
||||
}
|
||||
|
||||
@ -6657,21 +6590,6 @@ static struct ccwgroup_driver qeth_core_ccwgroup_driver = {
|
||||
.shutdown = qeth_core_shutdown,
|
||||
};
|
||||
|
||||
struct qeth_card *qeth_get_card_by_busid(char *bus_id)
|
||||
{
|
||||
struct ccwgroup_device *gdev;
|
||||
struct qeth_card *card;
|
||||
|
||||
gdev = get_ccwgroupdev_by_busid(&qeth_core_ccwgroup_driver, bus_id);
|
||||
if (!gdev)
|
||||
return NULL;
|
||||
|
||||
card = dev_get_drvdata(&gdev->dev);
|
||||
put_device(&gdev->dev);
|
||||
return card;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(qeth_get_card_by_busid);
|
||||
|
||||
int qeth_do_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
|
||||
{
|
||||
struct qeth_card *card = dev->ml_priv;
|
||||
|
@ -232,9 +232,6 @@ static const struct ipa_cmd_names qeth_ipa_cmd_names[] = {
|
||||
{IPA_CMD_DELVLAN, "delvlan"},
|
||||
{IPA_CMD_VNICC, "vnic_characteristics"},
|
||||
{IPA_CMD_SETBRIDGEPORT_OSA, "set_bridge_port(osa)"},
|
||||
{IPA_CMD_SETCCID, "setccid"},
|
||||
{IPA_CMD_DELCCID, "delccid"},
|
||||
{IPA_CMD_MODCCID, "modccid"},
|
||||
{IPA_CMD_SETIP, "setip"},
|
||||
{IPA_CMD_QIPASSIST, "qipassist"},
|
||||
{IPA_CMD_SETASSPARMS, "setassparms"},
|
||||
|
@ -34,8 +34,6 @@ extern const unsigned char IPA_PDU_HEADER[];
|
||||
/*****************************************************************************/
|
||||
#define IPA_CMD_INITIATOR_HOST 0x00
|
||||
#define IPA_CMD_INITIATOR_OSA 0x01
|
||||
#define IPA_CMD_INITIATOR_HOST_REPLY 0x80
|
||||
#define IPA_CMD_INITIATOR_OSA_REPLY 0x81
|
||||
#define IPA_CMD_PRIM_VERSION_NO 0x01
|
||||
|
||||
struct qeth_ipa_caps {
|
||||
@ -66,7 +64,6 @@ static inline bool qeth_ipa_caps_enabled(struct qeth_ipa_caps *caps, u32 mask)
|
||||
enum qeth_card_types {
|
||||
QETH_CARD_TYPE_OSD = 1,
|
||||
QETH_CARD_TYPE_IQD = 5,
|
||||
QETH_CARD_TYPE_OSN = 6,
|
||||
QETH_CARD_TYPE_OSM = 3,
|
||||
QETH_CARD_TYPE_OSX = 2,
|
||||
};
|
||||
@ -75,12 +72,6 @@ enum qeth_card_types {
|
||||
#define IS_OSD(card) ((card)->info.type == QETH_CARD_TYPE_OSD)
|
||||
#define IS_OSM(card) ((card)->info.type == QETH_CARD_TYPE_OSM)
|
||||
|
||||
#ifdef CONFIG_QETH_OSN
|
||||
#define IS_OSN(card) ((card)->info.type == QETH_CARD_TYPE_OSN)
|
||||
#else
|
||||
#define IS_OSN(card) false
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_QETH_OSX
|
||||
#define IS_OSX(card) ((card)->info.type == QETH_CARD_TYPE_OSX)
|
||||
#else
|
||||
@ -95,7 +86,6 @@ enum qeth_link_types {
|
||||
QETH_LINK_TYPE_FAST_ETH = 0x01,
|
||||
QETH_LINK_TYPE_HSTR = 0x02,
|
||||
QETH_LINK_TYPE_GBIT_ETH = 0x03,
|
||||
QETH_LINK_TYPE_OSN = 0x04,
|
||||
QETH_LINK_TYPE_10GBIT_ETH = 0x10,
|
||||
QETH_LINK_TYPE_25GBIT_ETH = 0x12,
|
||||
QETH_LINK_TYPE_LANE_ETH100 = 0x81,
|
||||
@ -126,9 +116,6 @@ enum qeth_ipa_cmds {
|
||||
IPA_CMD_DELVLAN = 0x26,
|
||||
IPA_CMD_VNICC = 0x2a,
|
||||
IPA_CMD_SETBRIDGEPORT_OSA = 0x2b,
|
||||
IPA_CMD_SETCCID = 0x41,
|
||||
IPA_CMD_DELCCID = 0x42,
|
||||
IPA_CMD_MODCCID = 0x43,
|
||||
IPA_CMD_SETIP = 0xb1,
|
||||
IPA_CMD_QIPASSIST = 0xb2,
|
||||
IPA_CMD_SETASSPARMS = 0xb3,
|
||||
@ -879,8 +866,7 @@ extern const char *qeth_get_ipa_msg(enum qeth_ipa_return_codes rc);
|
||||
extern const char *qeth_get_ipa_cmd_name(enum qeth_ipa_cmds cmd);
|
||||
|
||||
/* Helper functions */
|
||||
#define IS_IPA_REPLY(cmd) ((cmd->hdr.initiator == IPA_CMD_INITIATOR_HOST) || \
|
||||
(cmd->hdr.initiator == IPA_CMD_INITIATOR_OSA_REPLY))
|
||||
#define IS_IPA_REPLY(cmd) ((cmd)->hdr.initiator == IPA_CMD_INITIATOR_HOST)
|
||||
|
||||
/*****************************************************************************/
|
||||
/* END OF IP Assist related definitions */
|
||||
@ -919,10 +905,9 @@ extern const unsigned char ULP_ENABLE[];
|
||||
(PDU_ENCAPSULATION(buffer) + 0x17)
|
||||
#define QETH_ULP_ENABLE_RESP_LINK_TYPE(buffer) \
|
||||
(PDU_ENCAPSULATION(buffer) + 0x2b)
|
||||
/* Layer 2 definitions */
|
||||
#define QETH_PROT_LAYER2 0x08
|
||||
#define QETH_PROT_TCPIP 0x03
|
||||
#define QETH_PROT_OSN2 0x0a
|
||||
|
||||
#define QETH_MPC_PROT_L2 0x08
|
||||
#define QETH_MPC_PROT_L3 0x03
|
||||
#define QETH_ULP_ENABLE_PROT_TYPE(buffer) (buffer + 0x50)
|
||||
#define QETH_IPA_CMD_PROT_TYPE(buffer) (buffer + 0x19)
|
||||
|
||||
|
@ -671,11 +671,6 @@ static const struct attribute_group qeth_dev_group = {
|
||||
.attrs = qeth_dev_attrs,
|
||||
};
|
||||
|
||||
const struct attribute_group *qeth_osn_dev_groups[] = {
|
||||
&qeth_dev_group,
|
||||
NULL,
|
||||
};
|
||||
|
||||
const struct attribute_group *qeth_dev_groups[] = {
|
||||
&qeth_dev_group,
|
||||
&qeth_dev_extended_group,
|
||||
|
@ -469,10 +469,3 @@ const struct ethtool_ops qeth_ethtool_ops = {
|
||||
.set_per_queue_coalesce = qeth_set_per_queue_coalesce,
|
||||
.get_link_ksettings = qeth_get_link_ksettings,
|
||||
};
|
||||
|
||||
const struct ethtool_ops qeth_osn_ethtool_ops = {
|
||||
.get_strings = qeth_get_strings,
|
||||
.get_ethtool_stats = qeth_get_ethtool_stats,
|
||||
.get_sset_count = qeth_get_sset_count,
|
||||
.get_drvinfo = qeth_get_drvinfo,
|
||||
};
|
||||
|
@ -309,17 +309,16 @@ static int qeth_l2_request_initial_mac(struct qeth_card *card)
|
||||
/* fall back to alternative mechanism: */
|
||||
}
|
||||
|
||||
if (!IS_OSN(card)) {
|
||||
rc = qeth_setadpparms_change_macaddr(card);
|
||||
if (!rc)
|
||||
goto out;
|
||||
QETH_DBF_MESSAGE(2, "READ_MAC Assist failed on device %x: %#x\n",
|
||||
CARD_DEVID(card), rc);
|
||||
QETH_CARD_TEXT_(card, 2, "1err%04x", rc);
|
||||
/* fall back once more: */
|
||||
}
|
||||
rc = qeth_setadpparms_change_macaddr(card);
|
||||
if (!rc)
|
||||
goto out;
|
||||
QETH_DBF_MESSAGE(2, "READ_MAC Assist failed on device %x: %#x\n",
|
||||
CARD_DEVID(card), rc);
|
||||
QETH_CARD_TEXT_(card, 2, "1err%04x", rc);
|
||||
|
||||
/* some devices don't support a custom MAC address: */
|
||||
/* Fall back once more, but some devices don't support a custom MAC
|
||||
* address:
|
||||
*/
|
||||
if (IS_OSM(card) || IS_OSX(card))
|
||||
return (rc) ? rc : -EADDRNOTAVAIL;
|
||||
eth_hw_addr_random(card->dev);
|
||||
@ -334,7 +333,7 @@ static void qeth_l2_register_dev_addr(struct qeth_card *card)
|
||||
if (!is_valid_ether_addr(card->dev->dev_addr))
|
||||
qeth_l2_request_initial_mac(card);
|
||||
|
||||
if (!IS_OSN(card) && !qeth_l2_send_setmac(card, card->dev->dev_addr))
|
||||
if (!qeth_l2_send_setmac(card, card->dev->dev_addr))
|
||||
card->info.dev_addr_is_registered = 1;
|
||||
else
|
||||
card->info.dev_addr_is_registered = 0;
|
||||
@ -496,44 +495,6 @@ static void qeth_l2_rx_mode_work(struct work_struct *work)
|
||||
qeth_l2_set_promisc_mode(card);
|
||||
}
|
||||
|
||||
static int qeth_l2_xmit_osn(struct qeth_card *card, struct sk_buff *skb,
|
||||
struct qeth_qdio_out_q *queue)
|
||||
{
|
||||
gfp_t gfp = GFP_ATOMIC | (skb_pfmemalloc(skb) ? __GFP_MEMALLOC : 0);
|
||||
struct qeth_hdr *hdr = (struct qeth_hdr *)skb->data;
|
||||
addr_t end = (addr_t)(skb->data + sizeof(*hdr));
|
||||
addr_t start = (addr_t)skb->data;
|
||||
unsigned int elements = 0;
|
||||
unsigned int hd_len = 0;
|
||||
int rc;
|
||||
|
||||
if (skb->protocol == htons(ETH_P_IPV6))
|
||||
return -EPROTONOSUPPORT;
|
||||
|
||||
if (qeth_get_elements_for_range(start, end) > 1) {
|
||||
/* Misaligned HW header, move it to its own buffer element. */
|
||||
hdr = kmem_cache_alloc(qeth_core_header_cache, gfp);
|
||||
if (!hdr)
|
||||
return -ENOMEM;
|
||||
hd_len = sizeof(*hdr);
|
||||
skb_copy_from_linear_data(skb, (char *)hdr, hd_len);
|
||||
elements++;
|
||||
}
|
||||
|
||||
elements += qeth_count_elements(skb, hd_len);
|
||||
if (elements > queue->max_elements) {
|
||||
rc = -E2BIG;
|
||||
goto out;
|
||||
}
|
||||
|
||||
rc = qeth_do_send_packet(card, queue, skb, hdr, hd_len, hd_len,
|
||||
elements);
|
||||
out:
|
||||
if (rc && hd_len)
|
||||
kmem_cache_free(qeth_core_header_cache, hdr);
|
||||
return rc;
|
||||
}
|
||||
|
||||
static netdev_tx_t qeth_l2_hard_start_xmit(struct sk_buff *skb,
|
||||
struct net_device *dev)
|
||||
{
|
||||
@ -548,12 +509,8 @@ static netdev_tx_t qeth_l2_hard_start_xmit(struct sk_buff *skb,
|
||||
txq = qeth_iqd_translate_txq(dev, txq);
|
||||
queue = card->qdio.out_qs[txq];
|
||||
|
||||
if (IS_OSN(card))
|
||||
rc = qeth_l2_xmit_osn(card, skb, queue);
|
||||
else
|
||||
rc = qeth_xmit(card, skb, queue, vlan_get_protocol(skb),
|
||||
qeth_l2_fill_header);
|
||||
|
||||
rc = qeth_xmit(card, skb, queue, vlan_get_protocol(skb),
|
||||
qeth_l2_fill_header);
|
||||
if (!rc)
|
||||
return NETDEV_TX_OK;
|
||||
|
||||
@ -890,23 +847,8 @@ static const struct net_device_ops qeth_l2_netdev_ops = {
|
||||
.ndo_bridge_setlink = qeth_l2_bridge_setlink,
|
||||
};
|
||||
|
||||
static const struct net_device_ops qeth_osn_netdev_ops = {
|
||||
.ndo_open = qeth_open,
|
||||
.ndo_stop = qeth_stop,
|
||||
.ndo_get_stats64 = qeth_get_stats64,
|
||||
.ndo_start_xmit = qeth_l2_hard_start_xmit,
|
||||
.ndo_validate_addr = eth_validate_addr,
|
||||
.ndo_tx_timeout = qeth_tx_timeout,
|
||||
};
|
||||
|
||||
static int qeth_l2_setup_netdev(struct qeth_card *card)
|
||||
{
|
||||
if (IS_OSN(card)) {
|
||||
card->dev->netdev_ops = &qeth_osn_netdev_ops;
|
||||
card->dev->flags |= IFF_NOARP;
|
||||
goto add_napi;
|
||||
}
|
||||
|
||||
card->dev->needed_headroom = sizeof(struct qeth_hdr);
|
||||
card->dev->netdev_ops = &qeth_l2_netdev_ops;
|
||||
card->dev->priv_flags |= IFF_UNICAST_FLT;
|
||||
@ -952,7 +894,6 @@ static int qeth_l2_setup_netdev(struct qeth_card *card)
|
||||
PAGE_SIZE * (QDIO_MAX_ELEMENTS_PER_BUFFER - 1));
|
||||
}
|
||||
|
||||
add_napi:
|
||||
netif_napi_add(card->dev, &card->napi, qeth_poll, QETH_NAPI_WEIGHT);
|
||||
return register_netdev(card->dev);
|
||||
}
|
||||
@ -1044,84 +985,6 @@ static void qeth_l2_enable_brport_features(struct qeth_card *card)
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef CONFIG_QETH_OSN
|
||||
static void qeth_osn_assist_cb(struct qeth_card *card,
|
||||
struct qeth_cmd_buffer *iob,
|
||||
unsigned int data_length)
|
||||
{
|
||||
qeth_notify_cmd(iob, 0);
|
||||
qeth_put_cmd(iob);
|
||||
}
|
||||
|
||||
int qeth_osn_assist(struct net_device *dev, void *data, int data_len)
|
||||
{
|
||||
struct qeth_cmd_buffer *iob;
|
||||
struct qeth_card *card;
|
||||
|
||||
if (data_len < 0)
|
||||
return -EINVAL;
|
||||
if (!dev)
|
||||
return -ENODEV;
|
||||
card = dev->ml_priv;
|
||||
if (!card)
|
||||
return -ENODEV;
|
||||
QETH_CARD_TEXT(card, 2, "osnsdmc");
|
||||
if (!qeth_card_hw_is_reachable(card))
|
||||
return -ENODEV;
|
||||
|
||||
iob = qeth_alloc_cmd(&card->write, IPA_PDU_HEADER_SIZE + data_len, 1,
|
||||
QETH_IPA_TIMEOUT);
|
||||
if (!iob)
|
||||
return -ENOMEM;
|
||||
|
||||
qeth_prepare_ipa_cmd(card, iob, (u16) data_len, NULL);
|
||||
|
||||
memcpy(__ipa_cmd(iob), data, data_len);
|
||||
iob->callback = qeth_osn_assist_cb;
|
||||
return qeth_send_ipa_cmd(card, iob, NULL, NULL);
|
||||
}
|
||||
EXPORT_SYMBOL(qeth_osn_assist);
|
||||
|
||||
int qeth_osn_register(unsigned char *read_dev_no, struct net_device **dev,
|
||||
int (*assist_cb)(struct net_device *, void *),
|
||||
int (*data_cb)(struct sk_buff *))
|
||||
{
|
||||
struct qeth_card *card;
|
||||
char bus_id[16];
|
||||
u16 devno;
|
||||
|
||||
memcpy(&devno, read_dev_no, 2);
|
||||
sprintf(bus_id, "0.0.%04x", devno);
|
||||
card = qeth_get_card_by_busid(bus_id);
|
||||
if (!card || !IS_OSN(card))
|
||||
return -ENODEV;
|
||||
*dev = card->dev;
|
||||
|
||||
QETH_CARD_TEXT(card, 2, "osnreg");
|
||||
if ((assist_cb == NULL) || (data_cb == NULL))
|
||||
return -EINVAL;
|
||||
card->osn_info.assist_cb = assist_cb;
|
||||
card->osn_info.data_cb = data_cb;
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(qeth_osn_register);
|
||||
|
||||
void qeth_osn_deregister(struct net_device *dev)
|
||||
{
|
||||
struct qeth_card *card;
|
||||
|
||||
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;
|
||||
}
|
||||
EXPORT_SYMBOL(qeth_osn_deregister);
|
||||
#endif
|
||||
|
||||
/* SETBRIDGEPORT support, async notifications */
|
||||
|
||||
enum qeth_an_event_type {anev_reg_unreg, anev_abort, anev_reset};
|
||||
@ -2190,16 +2053,15 @@ static int qeth_l2_probe_device(struct ccwgroup_device *gdev)
|
||||
struct qeth_card *card = dev_get_drvdata(&gdev->dev);
|
||||
int rc;
|
||||
|
||||
if (IS_OSN(card))
|
||||
dev_notice(&gdev->dev, "OSN support will be dropped in 2021\n");
|
||||
|
||||
qeth_l2_vnicc_set_defaults(card);
|
||||
mutex_init(&card->sbp_lock);
|
||||
|
||||
if (gdev->dev.type == &qeth_generic_devtype) {
|
||||
if (gdev->dev.type) {
|
||||
rc = device_add_groups(&gdev->dev, qeth_l2_attr_groups);
|
||||
if (rc)
|
||||
return rc;
|
||||
} else {
|
||||
gdev->dev.type = &qeth_l2_devtype;
|
||||
}
|
||||
|
||||
INIT_WORK(&card->rx_mode_work, qeth_l2_rx_mode_work);
|
||||
@ -2210,8 +2072,9 @@ static void qeth_l2_remove_device(struct ccwgroup_device *gdev)
|
||||
{
|
||||
struct qeth_card *card = dev_get_drvdata(&gdev->dev);
|
||||
|
||||
if (gdev->dev.type == &qeth_generic_devtype)
|
||||
if (gdev->dev.type != &qeth_l2_devtype)
|
||||
device_remove_groups(&gdev->dev, qeth_l2_attr_groups);
|
||||
|
||||
qeth_set_allowed_threads(card, 0, 1);
|
||||
wait_event(card->wait_q, qeth_threads_running(card, 0xffffffff) == 0);
|
||||
|
||||
@ -2331,7 +2194,6 @@ static int qeth_l2_control_event(struct qeth_card *card,
|
||||
}
|
||||
|
||||
const struct qeth_discipline qeth_l2_discipline = {
|
||||
.devtype = &qeth_l2_devtype,
|
||||
.setup = qeth_l2_probe_device,
|
||||
.remove = qeth_l2_remove_device,
|
||||
.set_online = qeth_l2_set_online,
|
||||
|
@ -1939,12 +1939,14 @@ static int qeth_l3_probe_device(struct ccwgroup_device *gdev)
|
||||
if (!card->cmd_wq)
|
||||
return -ENOMEM;
|
||||
|
||||
if (gdev->dev.type == &qeth_generic_devtype) {
|
||||
if (gdev->dev.type) {
|
||||
rc = device_add_groups(&gdev->dev, qeth_l3_attr_groups);
|
||||
if (rc) {
|
||||
destroy_workqueue(card->cmd_wq);
|
||||
return rc;
|
||||
}
|
||||
} else {
|
||||
gdev->dev.type = &qeth_l3_devtype;
|
||||
}
|
||||
|
||||
INIT_WORK(&card->rx_mode_work, qeth_l3_rx_mode_work);
|
||||
@ -1955,7 +1957,7 @@ static void qeth_l3_remove_device(struct ccwgroup_device *cgdev)
|
||||
{
|
||||
struct qeth_card *card = dev_get_drvdata(&cgdev->dev);
|
||||
|
||||
if (cgdev->dev.type == &qeth_generic_devtype)
|
||||
if (cgdev->dev.type != &qeth_l3_devtype)
|
||||
device_remove_groups(&cgdev->dev, qeth_l3_attr_groups);
|
||||
|
||||
qeth_set_allowed_threads(card, 0, 1);
|
||||
@ -2064,7 +2066,6 @@ static int qeth_l3_control_event(struct qeth_card *card,
|
||||
}
|
||||
|
||||
const struct qeth_discipline qeth_l3_discipline = {
|
||||
.devtype = &qeth_l3_devtype,
|
||||
.setup = qeth_l3_probe_device,
|
||||
.remove = qeth_l3_remove_device,
|
||||
.set_online = qeth_l3_set_online,
|
||||
|
Loading…
Reference in New Issue
Block a user