root/drivers/s390/scsi/zfcp_ccw.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. zfcp_ccw_adapter_by_cdev
  2. zfcp_ccw_adapter_put
  3. zfcp_ccw_activate
  4. zfcp_ccw_probe
  5. zfcp_ccw_remove
  6. zfcp_ccw_set_online
  7. zfcp_ccw_offline_sync
  8. zfcp_ccw_set_offline
  9. zfcp_ccw_notify
  10. zfcp_ccw_shutdown
  11. zfcp_ccw_suspend
  12. zfcp_ccw_thaw
  13. zfcp_ccw_resume

   1 // SPDX-License-Identifier: GPL-2.0
   2 /*
   3  * zfcp device driver
   4  *
   5  * Registration and callback for the s390 common I/O layer.
   6  *
   7  * Copyright IBM Corp. 2002, 2010
   8  */
   9 
  10 #define KMSG_COMPONENT "zfcp"
  11 #define pr_fmt(fmt) KMSG_COMPONENT ": " fmt
  12 
  13 #include <linux/module.h>
  14 #include "zfcp_ext.h"
  15 #include "zfcp_reqlist.h"
  16 
  17 #define ZFCP_MODEL_PRIV 0x4
  18 
  19 static DEFINE_SPINLOCK(zfcp_ccw_adapter_ref_lock);
  20 
  21 struct zfcp_adapter *zfcp_ccw_adapter_by_cdev(struct ccw_device *cdev)
  22 {
  23         struct zfcp_adapter *adapter;
  24         unsigned long flags;
  25 
  26         spin_lock_irqsave(&zfcp_ccw_adapter_ref_lock, flags);
  27         adapter = dev_get_drvdata(&cdev->dev);
  28         if (adapter)
  29                 kref_get(&adapter->ref);
  30         spin_unlock_irqrestore(&zfcp_ccw_adapter_ref_lock, flags);
  31         return adapter;
  32 }
  33 
  34 void zfcp_ccw_adapter_put(struct zfcp_adapter *adapter)
  35 {
  36         unsigned long flags;
  37 
  38         spin_lock_irqsave(&zfcp_ccw_adapter_ref_lock, flags);
  39         kref_put(&adapter->ref, zfcp_adapter_release);
  40         spin_unlock_irqrestore(&zfcp_ccw_adapter_ref_lock, flags);
  41 }
  42 
  43 /**
  44  * zfcp_ccw_activate - activate adapter and wait for it to finish
  45  * @cdev: pointer to belonging ccw device
  46  * @clear: Status flags to clear.
  47  * @tag: s390dbf trace record tag
  48  */
  49 static int zfcp_ccw_activate(struct ccw_device *cdev, int clear, char *tag)
  50 {
  51         struct zfcp_adapter *adapter = zfcp_ccw_adapter_by_cdev(cdev);
  52 
  53         if (!adapter)
  54                 return 0;
  55 
  56         zfcp_erp_clear_adapter_status(adapter, clear);
  57         zfcp_erp_set_adapter_status(adapter, ZFCP_STATUS_COMMON_RUNNING);
  58         zfcp_erp_adapter_reopen(adapter, ZFCP_STATUS_COMMON_ERP_FAILED,
  59                                 tag);
  60 
  61         /*
  62          * We want to scan ports here, with some random backoff and without
  63          * rate limit. Recovery has already scheduled a port scan for us,
  64          * but with both random delay and rate limit. Nevertheless we get
  65          * what we want here by flushing the scheduled work after sleeping
  66          * an equivalent random time.
  67          * Let the port scan random delay elapse first. If recovery finishes
  68          * up to that point in time, that would be perfect for both recovery
  69          * and port scan. If not, i.e. recovery takes ages, there was no
  70          * point in waiting a random delay on top of the time consumed by
  71          * recovery.
  72          */
  73         msleep(zfcp_fc_port_scan_backoff());
  74         zfcp_erp_wait(adapter);
  75         flush_delayed_work(&adapter->scan_work);
  76 
  77         zfcp_ccw_adapter_put(adapter);
  78 
  79         return 0;
  80 }
  81 
  82 static struct ccw_device_id zfcp_ccw_device_id[] = {
  83         { CCW_DEVICE_DEVTYPE(0x1731, 0x3, 0x1732, 0x3) },
  84         { CCW_DEVICE_DEVTYPE(0x1731, 0x3, 0x1732, ZFCP_MODEL_PRIV) },
  85         {},
  86 };
  87 MODULE_DEVICE_TABLE(ccw, zfcp_ccw_device_id);
  88 
  89 /**
  90  * zfcp_ccw_probe - probe function of zfcp driver
  91  * @cdev: pointer to belonging ccw device
  92  *
  93  * This function gets called by the common i/o layer for each FCP
  94  * device found on the current system. This is only a stub to make cio
  95  * work: To only allocate adapter resources for devices actually used,
  96  * the allocation is deferred to the first call to ccw_set_online.
  97  */
  98 static int zfcp_ccw_probe(struct ccw_device *cdev)
  99 {
 100         return 0;
 101 }
 102 
 103 /**
 104  * zfcp_ccw_remove - remove function of zfcp driver
 105  * @cdev: pointer to belonging ccw device
 106  *
 107  * This function gets called by the common i/o layer and removes an adapter
 108  * from the system. Task of this function is to get rid of all units and
 109  * ports that belong to this adapter. And in addition all resources of this
 110  * adapter will be freed too.
 111  */
 112 static void zfcp_ccw_remove(struct ccw_device *cdev)
 113 {
 114         struct zfcp_adapter *adapter;
 115         struct zfcp_port *port, *p;
 116         struct zfcp_unit *unit, *u;
 117         LIST_HEAD(unit_remove_lh);
 118         LIST_HEAD(port_remove_lh);
 119 
 120         ccw_device_set_offline(cdev);
 121 
 122         adapter = zfcp_ccw_adapter_by_cdev(cdev);
 123         if (!adapter)
 124                 return;
 125 
 126         write_lock_irq(&adapter->port_list_lock);
 127         list_for_each_entry_safe(port, p, &adapter->port_list, list) {
 128                 write_lock(&port->unit_list_lock);
 129                 list_for_each_entry_safe(unit, u, &port->unit_list, list)
 130                         list_move(&unit->list, &unit_remove_lh);
 131                 write_unlock(&port->unit_list_lock);
 132                 list_move(&port->list, &port_remove_lh);
 133         }
 134         write_unlock_irq(&adapter->port_list_lock);
 135         zfcp_ccw_adapter_put(adapter); /* put from zfcp_ccw_adapter_by_cdev */
 136 
 137         list_for_each_entry_safe(unit, u, &unit_remove_lh, list)
 138                 device_unregister(&unit->dev);
 139 
 140         list_for_each_entry_safe(port, p, &port_remove_lh, list)
 141                 device_unregister(&port->dev);
 142 
 143         zfcp_adapter_unregister(adapter);
 144 }
 145 
 146 /**
 147  * zfcp_ccw_set_online - set_online function of zfcp driver
 148  * @cdev: pointer to belonging ccw device
 149  *
 150  * This function gets called by the common i/o layer and sets an
 151  * adapter into state online.  The first call will allocate all
 152  * adapter resources that will be retained until the device is removed
 153  * via zfcp_ccw_remove.
 154  *
 155  * Setting an fcp device online means that it will be registered with
 156  * the SCSI stack, that the QDIO queues will be set up and that the
 157  * adapter will be opened.
 158  */
 159 static int zfcp_ccw_set_online(struct ccw_device *cdev)
 160 {
 161         struct zfcp_adapter *adapter = zfcp_ccw_adapter_by_cdev(cdev);
 162 
 163         if (!adapter) {
 164                 adapter = zfcp_adapter_enqueue(cdev);
 165 
 166                 if (IS_ERR(adapter)) {
 167                         dev_err(&cdev->dev,
 168                                 "Setting up data structures for the "
 169                                 "FCP adapter failed\n");
 170                         return PTR_ERR(adapter);
 171                 }
 172                 kref_get(&adapter->ref);
 173         }
 174 
 175         /* initialize request counter */
 176         BUG_ON(!zfcp_reqlist_isempty(adapter->req_list));
 177         adapter->req_no = 0;
 178 
 179         zfcp_ccw_activate(cdev, 0, "ccsonl1");
 180 
 181         /*
 182          * We want to scan ports here, always, with some random delay and
 183          * without rate limit - basically what zfcp_ccw_activate() has
 184          * achieved for us. Not quite! That port scan depended on
 185          * !no_auto_port_rescan. So let's cover the no_auto_port_rescan
 186          * case here to make sure a port scan is done unconditionally.
 187          * Since zfcp_ccw_activate() has waited the desired random time,
 188          * we can immediately schedule and flush a port scan for the
 189          * remaining cases.
 190          */
 191         zfcp_fc_inverse_conditional_port_scan(adapter);
 192         flush_delayed_work(&adapter->scan_work);
 193         zfcp_ccw_adapter_put(adapter);
 194         return 0;
 195 }
 196 
 197 /**
 198  * zfcp_ccw_offline_sync - shut down adapter and wait for it to finish
 199  * @cdev: pointer to belonging ccw device
 200  * @set: Status flags to set.
 201  * @tag: s390dbf trace record tag
 202  *
 203  * This function gets called by the common i/o layer and sets an adapter
 204  * into state offline.
 205  */
 206 static int zfcp_ccw_offline_sync(struct ccw_device *cdev, int set, char *tag)
 207 {
 208         struct zfcp_adapter *adapter = zfcp_ccw_adapter_by_cdev(cdev);
 209 
 210         if (!adapter)
 211                 return 0;
 212 
 213         zfcp_erp_set_adapter_status(adapter, set);
 214         zfcp_erp_adapter_shutdown(adapter, 0, tag);
 215         zfcp_erp_wait(adapter);
 216 
 217         zfcp_ccw_adapter_put(adapter);
 218         return 0;
 219 }
 220 
 221 /**
 222  * zfcp_ccw_set_offline - set_offline function of zfcp driver
 223  * @cdev: pointer to belonging ccw device
 224  *
 225  * This function gets called by the common i/o layer and sets an adapter
 226  * into state offline.
 227  */
 228 static int zfcp_ccw_set_offline(struct ccw_device *cdev)
 229 {
 230         return zfcp_ccw_offline_sync(cdev, 0, "ccsoff1");
 231 }
 232 
 233 /**
 234  * zfcp_ccw_notify - ccw notify function
 235  * @cdev: pointer to belonging ccw device
 236  * @event: indicates if adapter was detached or attached
 237  *
 238  * This function gets called by the common i/o layer if an adapter has gone
 239  * or reappeared.
 240  */
 241 static int zfcp_ccw_notify(struct ccw_device *cdev, int event)
 242 {
 243         struct zfcp_adapter *adapter = zfcp_ccw_adapter_by_cdev(cdev);
 244 
 245         if (!adapter)
 246                 return 1;
 247 
 248         switch (event) {
 249         case CIO_GONE:
 250                 if (atomic_read(&adapter->status) &
 251                     ZFCP_STATUS_ADAPTER_SUSPENDED) { /* notification ignore */
 252                         zfcp_dbf_hba_basic("ccnigo1", adapter);
 253                         break;
 254                 }
 255                 dev_warn(&cdev->dev, "The FCP device has been detached\n");
 256                 zfcp_erp_adapter_shutdown(adapter, 0, "ccnoti1");
 257                 break;
 258         case CIO_NO_PATH:
 259                 dev_warn(&cdev->dev,
 260                          "The CHPID for the FCP device is offline\n");
 261                 zfcp_erp_adapter_shutdown(adapter, 0, "ccnoti2");
 262                 break;
 263         case CIO_OPER:
 264                 if (atomic_read(&adapter->status) &
 265                     ZFCP_STATUS_ADAPTER_SUSPENDED) { /* notification ignore */
 266                         zfcp_dbf_hba_basic("ccniop1", adapter);
 267                         break;
 268                 }
 269                 dev_info(&cdev->dev, "The FCP device is operational again\n");
 270                 zfcp_erp_set_adapter_status(adapter,
 271                                             ZFCP_STATUS_COMMON_RUNNING);
 272                 zfcp_erp_adapter_reopen(adapter, ZFCP_STATUS_COMMON_ERP_FAILED,
 273                                         "ccnoti4");
 274                 break;
 275         case CIO_BOXED:
 276                 dev_warn(&cdev->dev, "The FCP device did not respond within "
 277                                      "the specified time\n");
 278                 zfcp_erp_adapter_shutdown(adapter, 0, "ccnoti5");
 279                 break;
 280         }
 281 
 282         zfcp_ccw_adapter_put(adapter);
 283         return 1;
 284 }
 285 
 286 /**
 287  * zfcp_ccw_shutdown - handle shutdown from cio
 288  * @cdev: device for adapter to shutdown.
 289  */
 290 static void zfcp_ccw_shutdown(struct ccw_device *cdev)
 291 {
 292         struct zfcp_adapter *adapter = zfcp_ccw_adapter_by_cdev(cdev);
 293 
 294         if (!adapter)
 295                 return;
 296 
 297         zfcp_erp_adapter_shutdown(adapter, 0, "ccshut1");
 298         zfcp_erp_wait(adapter);
 299         zfcp_erp_thread_kill(adapter);
 300 
 301         zfcp_ccw_adapter_put(adapter);
 302 }
 303 
 304 static int zfcp_ccw_suspend(struct ccw_device *cdev)
 305 {
 306         zfcp_ccw_offline_sync(cdev, ZFCP_STATUS_ADAPTER_SUSPENDED, "ccsusp1");
 307         return 0;
 308 }
 309 
 310 static int zfcp_ccw_thaw(struct ccw_device *cdev)
 311 {
 312         /* trace records for thaw and final shutdown during suspend
 313            can only be found in system dump until the end of suspend
 314            but not after resume because it's based on the memory image
 315            right after the very first suspend (freeze) callback */
 316         zfcp_ccw_activate(cdev, 0, "ccthaw1");
 317         return 0;
 318 }
 319 
 320 static int zfcp_ccw_resume(struct ccw_device *cdev)
 321 {
 322         zfcp_ccw_activate(cdev, ZFCP_STATUS_ADAPTER_SUSPENDED, "ccresu1");
 323         return 0;
 324 }
 325 
 326 struct ccw_driver zfcp_ccw_driver = {
 327         .driver = {
 328                 .owner  = THIS_MODULE,
 329                 .name   = "zfcp",
 330         },
 331         .ids         = zfcp_ccw_device_id,
 332         .probe       = zfcp_ccw_probe,
 333         .remove      = zfcp_ccw_remove,
 334         .set_online  = zfcp_ccw_set_online,
 335         .set_offline = zfcp_ccw_set_offline,
 336         .notify      = zfcp_ccw_notify,
 337         .shutdown    = zfcp_ccw_shutdown,
 338         .freeze      = zfcp_ccw_suspend,
 339         .thaw        = zfcp_ccw_thaw,
 340         .restore     = zfcp_ccw_resume,
 341 };

/* [<][>][^][v][top][bottom][index][help] */