Commit c4733c32 authored by Julian Wiedmann's avatar Julian Wiedmann Committed by David S. Miller

s390/qeth: consolidate pm code

De-duplicate the pm callback implementations from the two sub-drivers,
replacing them with core helpers that delegate to the .set_online and
.set_offline callbacks.
Signed-off-by: default avatarJulian Wiedmann <jwi@linux.ibm.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent d4c08afa
...@@ -713,9 +713,6 @@ struct qeth_discipline { ...@@ -713,9 +713,6 @@ struct qeth_discipline {
void (*remove) (struct ccwgroup_device *); void (*remove) (struct ccwgroup_device *);
int (*set_online) (struct ccwgroup_device *); int (*set_online) (struct ccwgroup_device *);
int (*set_offline) (struct ccwgroup_device *); int (*set_offline) (struct ccwgroup_device *);
int (*freeze)(struct ccwgroup_device *);
int (*thaw) (struct ccwgroup_device *);
int (*restore)(struct ccwgroup_device *);
int (*do_ioctl)(struct net_device *dev, struct ifreq *rq, int cmd); int (*do_ioctl)(struct net_device *dev, struct ifreq *rq, int cmd);
int (*control_event_handler)(struct qeth_card *card, int (*control_event_handler)(struct qeth_card *card,
struct qeth_ipa_cmd *cmd); struct qeth_ipa_cmd *cmd);
......
...@@ -5589,28 +5589,30 @@ static void qeth_core_shutdown(struct ccwgroup_device *gdev) ...@@ -5589,28 +5589,30 @@ static void qeth_core_shutdown(struct ccwgroup_device *gdev)
qdio_free(CARD_DDEV(card)); qdio_free(CARD_DDEV(card));
} }
static int qeth_core_freeze(struct ccwgroup_device *gdev) static int qeth_suspend(struct ccwgroup_device *gdev)
{ {
struct qeth_card *card = dev_get_drvdata(&gdev->dev); struct qeth_card *card = dev_get_drvdata(&gdev->dev);
if (card->discipline && card->discipline->freeze)
return card->discipline->freeze(gdev);
return 0;
}
static int qeth_core_thaw(struct ccwgroup_device *gdev) qeth_set_allowed_threads(card, 0, 1);
{ wait_event(card->wait_q, qeth_threads_running(card, 0xffffffff) == 0);
struct qeth_card *card = dev_get_drvdata(&gdev->dev); if (gdev->state == CCWGROUP_OFFLINE)
if (card->discipline && card->discipline->thaw) return 0;
return card->discipline->thaw(gdev);
card->discipline->set_offline(gdev);
return 0; return 0;
} }
static int qeth_core_restore(struct ccwgroup_device *gdev) static int qeth_resume(struct ccwgroup_device *gdev)
{ {
struct qeth_card *card = dev_get_drvdata(&gdev->dev); struct qeth_card *card = dev_get_drvdata(&gdev->dev);
if (card->discipline && card->discipline->restore) int rc;
return card->discipline->restore(gdev);
return 0; rc = card->discipline->set_online(gdev);
qeth_set_allowed_threads(card, 0xffffffff, 0);
if (rc)
dev_warn(&card->gdev->dev, "The qeth device driver failed to recover an error on the device\n");
return rc;
} }
static ssize_t group_store(struct device_driver *ddrv, const char *buf, static ssize_t group_store(struct device_driver *ddrv, const char *buf,
...@@ -5651,9 +5653,9 @@ static struct ccwgroup_driver qeth_core_ccwgroup_driver = { ...@@ -5651,9 +5653,9 @@ static struct ccwgroup_driver qeth_core_ccwgroup_driver = {
.shutdown = qeth_core_shutdown, .shutdown = qeth_core_shutdown,
.prepare = NULL, .prepare = NULL,
.complete = NULL, .complete = NULL,
.freeze = qeth_core_freeze, .freeze = qeth_suspend,
.thaw = qeth_core_thaw, .thaw = qeth_resume,
.restore = qeth_core_restore, .restore = qeth_resume,
}; };
struct qeth_card *qeth_get_card_by_busid(char *bus_id) struct qeth_card *qeth_get_card_by_busid(char *bus_id)
......
...@@ -965,33 +965,6 @@ static void __exit qeth_l2_exit(void) ...@@ -965,33 +965,6 @@ static void __exit qeth_l2_exit(void)
pr_info("unregister layer 2 discipline\n"); pr_info("unregister layer 2 discipline\n");
} }
static int qeth_l2_pm_suspend(struct ccwgroup_device *gdev)
{
struct qeth_card *card = dev_get_drvdata(&gdev->dev);
qeth_set_allowed_threads(card, 0, 1);
wait_event(card->wait_q, qeth_threads_running(card, 0xffffffff) == 0);
if (gdev->state == CCWGROUP_OFFLINE)
return 0;
qeth_l2_set_offline(gdev);
return 0;
}
static int qeth_l2_pm_resume(struct ccwgroup_device *gdev)
{
struct qeth_card *card = dev_get_drvdata(&gdev->dev);
int rc;
rc = qeth_l2_set_online(gdev);
qeth_set_allowed_threads(card, 0xffffffff, 0);
if (rc)
dev_warn(&card->gdev->dev, "The qeth device driver "
"failed to recover an error on the device\n");
return rc;
}
/* Returns zero if the command is successfully "consumed" */ /* Returns zero if the command is successfully "consumed" */
static int qeth_l2_control_event(struct qeth_card *card, static int qeth_l2_control_event(struct qeth_card *card,
struct qeth_ipa_cmd *cmd) struct qeth_ipa_cmd *cmd)
...@@ -1021,9 +994,6 @@ struct qeth_discipline qeth_l2_discipline = { ...@@ -1021,9 +994,6 @@ struct qeth_discipline qeth_l2_discipline = {
.remove = qeth_l2_remove_device, .remove = qeth_l2_remove_device,
.set_online = qeth_l2_set_online, .set_online = qeth_l2_set_online,
.set_offline = qeth_l2_set_offline, .set_offline = qeth_l2_set_offline,
.freeze = qeth_l2_pm_suspend,
.thaw = qeth_l2_pm_resume,
.restore = qeth_l2_pm_resume,
.do_ioctl = NULL, .do_ioctl = NULL,
.control_event_handler = qeth_l2_control_event, .control_event_handler = qeth_l2_control_event,
}; };
......
...@@ -2500,33 +2500,6 @@ static int qeth_l3_recover(void *ptr) ...@@ -2500,33 +2500,6 @@ static int qeth_l3_recover(void *ptr)
return 0; return 0;
} }
static int qeth_l3_pm_suspend(struct ccwgroup_device *gdev)
{
struct qeth_card *card = dev_get_drvdata(&gdev->dev);
qeth_set_allowed_threads(card, 0, 1);
wait_event(card->wait_q, qeth_threads_running(card, 0xffffffff) == 0);
if (gdev->state == CCWGROUP_OFFLINE)
return 0;
qeth_l3_set_offline(gdev);
return 0;
}
static int qeth_l3_pm_resume(struct ccwgroup_device *gdev)
{
struct qeth_card *card = dev_get_drvdata(&gdev->dev);
int rc;
rc = qeth_l3_set_online(gdev);
qeth_set_allowed_threads(card, 0xffffffff, 0);
if (rc)
dev_warn(&card->gdev->dev, "The qeth device driver "
"failed to recover an error on the device\n");
return rc;
}
/* Returns zero if the command is successfully "consumed" */ /* Returns zero if the command is successfully "consumed" */
static int qeth_l3_control_event(struct qeth_card *card, static int qeth_l3_control_event(struct qeth_card *card,
struct qeth_ipa_cmd *cmd) struct qeth_ipa_cmd *cmd)
...@@ -2542,9 +2515,6 @@ struct qeth_discipline qeth_l3_discipline = { ...@@ -2542,9 +2515,6 @@ struct qeth_discipline qeth_l3_discipline = {
.remove = qeth_l3_remove_device, .remove = qeth_l3_remove_device,
.set_online = qeth_l3_set_online, .set_online = qeth_l3_set_online,
.set_offline = qeth_l3_set_offline, .set_offline = qeth_l3_set_offline,
.freeze = qeth_l3_pm_suspend,
.thaw = qeth_l3_pm_resume,
.restore = qeth_l3_pm_resume,
.do_ioctl = qeth_l3_do_ioctl, .do_ioctl = qeth_l3_do_ioctl,
.control_event_handler = qeth_l3_control_event, .control_event_handler = qeth_l3_control_event,
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment