pps ktimer: remove noisy message
[firefly-linux-kernel-4.4.55.git] / drivers / cdrom / cdrom.c
index e3749d0ba68b540149951ca572779dc9b8e979bf..14033a36bcd031d4825574819ac64fba71b61ec9 100644 (file)
 
 -------------------------------------------------------------------------*/
 
+#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
+
 #define REVISION "Revision: 3.20"
 #define VERSION "Id: cdrom.c 3.20 2003/12/17"
 
@@ -314,11 +316,17 @@ static const char *mrw_format_status[] = {
 static const char *mrw_address_space[] = { "DMA", "GAA" };
 
 #if (ERRLOGMASK!=CD_NOTHING)
-#define cdinfo(type, fmt, args...) \
-        if ((ERRLOGMASK & type) || debug==1 ) \
-            printk(KERN_INFO "cdrom: " fmt, ## args)
+#define cdinfo(type, fmt, args...)                     \
+do {                                                   \
+       if ((ERRLOGMASK & type) || debug == 1)          \
+               pr_info(fmt, ##args);                   \
+} while (0)
 #else
-#define cdinfo(type, fmt, args...) 
+#define cdinfo(type, fmt, args...)                     \
+do {                                                   \
+       if (0 && (ERRLOGMASK & type) || debug == 1)     \
+               pr_info(fmt, ##args);                   \
+} while (0)
 #endif
 
 /* These are used to simplify getting data in from and back to user land */
@@ -395,7 +403,7 @@ int register_cdrom(struct cdrom_device_info *cdi)
        if (cdo->open == NULL || cdo->release == NULL)
                return -EINVAL;
        if (!banner_printed) {
-               printk(KERN_INFO "Uniform CD-ROM driver " REVISION "\n");
+               pr_info("Uniform CD-ROM driver " REVISION "\n");
                banner_printed = 1;
                cdrom_sysctl_register();
        }
@@ -546,7 +554,7 @@ static int cdrom_mrw_bgformat(struct cdrom_device_info *cdi, int cont)
        unsigned char buffer[12];
        int ret;
 
-       printk(KERN_INFO "cdrom: %sstarting format\n", cont ? "Re" : "");
+       pr_info("%sstarting format\n", cont ? "Re" : "");
 
        /*
         * FmtData bit set (bit 4), format type is 1
@@ -576,7 +584,7 @@ static int cdrom_mrw_bgformat(struct cdrom_device_info *cdi, int cont)
 
        ret = cdi->ops->generic_packet(cdi, &cgc);
        if (ret)
-               printk(KERN_INFO "cdrom: bgformat failed\n");
+               pr_info("bgformat failed\n");
 
        return ret;
 }
@@ -622,8 +630,7 @@ static int cdrom_mrw_exit(struct cdrom_device_info *cdi)
 
        ret = 0;
        if (di.mrw_status == CDM_MRW_BGFORMAT_ACTIVE) {
-               printk(KERN_INFO "cdrom: issuing MRW back ground "
-                               "format suspend\n");
+               pr_info("issuing MRW background format suspend\n");
                ret = cdrom_mrw_bgformat_susp(cdi, 0);
        }
 
@@ -658,7 +665,8 @@ static int cdrom_mrw_set_lba_space(struct cdrom_device_info *cdi, int space)
        if ((ret = cdrom_mode_select(cdi, &cgc)))
                return ret;
 
-       printk(KERN_INFO "cdrom: %s: mrw address space %s selected\n", cdi->name, mrw_address_space[space]);
+       pr_info("%s: mrw address space %s selected\n",
+               cdi->name, mrw_address_space[space]);
        return 0;
 }
 
@@ -762,7 +770,7 @@ static int cdrom_mrw_open_write(struct cdrom_device_info *cdi)
         * always reset to DMA lba space on open
         */
        if (cdrom_mrw_set_lba_space(cdi, MRW_LBA_DMA)) {
-               printk(KERN_ERR "cdrom: failed setting lba address space\n");
+               pr_err("failed setting lba address space\n");
                return 1;
        }
 
@@ -781,8 +789,7 @@ static int cdrom_mrw_open_write(struct cdrom_device_info *cdi)
         * 3    -       MRW formatting complete
         */
        ret = 0;
-       printk(KERN_INFO "cdrom open: mrw_status '%s'\n",
-                       mrw_format_status[di.mrw_status]);
+       pr_info("open: mrw_status '%s'\n", mrw_format_status[di.mrw_status]);
        if (!di.mrw_status)
                ret = 1;
        else if (di.mrw_status == CDM_MRW_BGFORMAT_INACTIVE &&
@@ -932,8 +939,7 @@ static void cdrom_dvd_rw_close_write(struct cdrom_device_info *cdi)
                return;
        }
 
-       printk(KERN_INFO "cdrom: %s: dirty DVD+RW media, \"finalizing\"\n",
-              cdi->name);
+       pr_info("%s: dirty DVD+RW media, \"finalizing\"\n", cdi->name);
 
        init_cdrom_command(&cgc, NULL, 0, CGC_DATA_NONE);
        cgc.cmd[0] = GPCMD_FLUSH_CACHE;
@@ -1342,7 +1348,10 @@ static int cdrom_select_disc(struct cdrom_device_info *cdi, int slot)
        if (!CDROM_CAN(CDC_SELECT_DISC))
                return -EDRIVE_CANT_DO_THIS;
 
-       (void) cdi->ops->media_changed(cdi, slot);
+       if (cdi->ops->check_events)
+               cdi->ops->check_events(cdi, 0, slot);
+       else
+               cdi->ops->media_changed(cdi, slot);
 
        if (slot == CDSL_NONE) {
                /* set media changed bits, on both queues */
@@ -1386,6 +1395,42 @@ static int cdrom_select_disc(struct cdrom_device_info *cdi, int slot)
        return slot;
 }
 
+/*
+ * As cdrom implements an extra ioctl consumer for media changed
+ * event, it needs to buffer ->check_events() output, such that event
+ * is not lost for both the usual VFS and ioctl paths.
+ * cdi->{vfs|ioctl}_events are used to buffer pending events for each
+ * path.
+ *
+ * XXX: Locking is non-existent.  cdi->ops->check_events() can be
+ * called in parallel and buffering fields are accessed without any
+ * exclusion.  The original media_changed code had the same problem.
+ * It might be better to simply deprecate CDROM_MEDIA_CHANGED ioctl
+ * and remove this cruft altogether.  It doesn't have much usefulness
+ * at this point.
+ */
+static void cdrom_update_events(struct cdrom_device_info *cdi,
+                               unsigned int clearing)
+{
+       unsigned int events;
+
+       events = cdi->ops->check_events(cdi, clearing, CDSL_CURRENT);
+       cdi->vfs_events |= events;
+       cdi->ioctl_events |= events;
+}
+
+unsigned int cdrom_check_events(struct cdrom_device_info *cdi,
+                               unsigned int clearing)
+{
+       unsigned int events;
+
+       cdrom_update_events(cdi, clearing);
+       events = cdi->vfs_events;
+       cdi->vfs_events = 0;
+       return events;
+}
+EXPORT_SYMBOL(cdrom_check_events);
+
 /* We want to make media_changed accessible to the user through an
  * ioctl. The main problem now is that we must double-buffer the
  * low-level implementation, to assure that the VFS and the user both
@@ -1397,15 +1442,26 @@ int media_changed(struct cdrom_device_info *cdi, int queue)
 {
        unsigned int mask = (1 << (queue & 1));
        int ret = !!(cdi->mc_flags & mask);
+       bool changed;
 
        if (!CDROM_CAN(CDC_MEDIA_CHANGED))
-           return ret;
+               return ret;
+
        /* changed since last call? */
-       if (cdi->ops->media_changed(cdi, CDSL_CURRENT)) {
+       if (cdi->ops->check_events) {
+               BUG_ON(!queue); /* shouldn't be called from VFS path */
+               cdrom_update_events(cdi, DISK_EVENT_MEDIA_CHANGE);
+               changed = cdi->ioctl_events & DISK_EVENT_MEDIA_CHANGE;
+               cdi->ioctl_events = 0;
+       } else
+               changed = cdi->ops->media_changed(cdi, CDSL_CURRENT);
+
+       if (changed) {
                cdi->mc_flags = 0x3;    /* set bit on both queues */
                ret |= 1;
                cdi->media_written = 0;
        }
+
        cdi->mc_flags &= ~mask;         /* clear bit */
        return ret;
 }
@@ -2176,7 +2232,7 @@ retry:
         * frame dma, so drop to single frame dma if we need to
         */
        if (cdi->cdda_method == CDDA_BPC_FULL && nframes > 1) {
-               printk("cdrom: dropping to single frame dma\n");
+               pr_info("dropping to single frame dma\n");
                cdi->cdda_method = CDDA_BPC_SINGLE;
                goto retry;
        }
@@ -2189,7 +2245,7 @@ retry:
        if (cdi->last_sense != 0x04 && cdi->last_sense != 0x0b)
                return ret;
 
-       printk("cdrom: dropping to old style cdda (sense=%x)\n", cdi->last_sense);
+       pr_info("dropping to old style cdda (sense=%x)\n", cdi->last_sense);
        cdi->cdda_method = CDDA_OLD;
        return cdrom_read_cdda_old(cdi, ubuf, lba, nframes);    
 }
@@ -3401,7 +3457,7 @@ static int cdrom_print_info(const char *header, int val, char *info,
                                        "\t%d", CDROM_CAN(val) != 0);
                        break;
                default:
-                       printk(KERN_INFO "cdrom: invalid option%d\n", option);
+                       pr_info("invalid option%d\n", option);
                        return 1;
                }
                if (!ret)
@@ -3491,7 +3547,7 @@ doit:
        mutex_unlock(&cdrom_mutex);
        return proc_dostring(ctl, write, buffer, lenp, ppos);
 done:
-       printk(KERN_INFO "cdrom: info buffer too small\n");
+       pr_info("info buffer too small\n");
        goto doit;
 }
 
@@ -3665,7 +3721,7 @@ static int __init cdrom_init(void)
 
 static void __exit cdrom_exit(void)
 {
-       printk(KERN_INFO "Uniform CD-ROM driver unloaded\n");
+       pr_info("Uniform CD-ROM driver unloaded\n");
        cdrom_sysctl_unregister();
 }