cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

tape_34xx.c (34524B)


      1// SPDX-License-Identifier: GPL-2.0
      2/*
      3 *    tape device discipline for 3480/3490 tapes.
      4 *
      5 *    Copyright IBM Corp. 2001, 2009
      6 *    Author(s): Carsten Otte <cotte@de.ibm.com>
      7 *		 Tuan Ngo-Anh <ngoanh@de.ibm.com>
      8 *		 Martin Schwidefsky <schwidefsky@de.ibm.com>
      9 */
     10
     11#define KMSG_COMPONENT "tape_34xx"
     12#define pr_fmt(fmt) KMSG_COMPONENT ": " fmt
     13
     14#include <linux/module.h>
     15#include <linux/init.h>
     16#include <linux/bio.h>
     17#include <linux/workqueue.h>
     18#include <linux/slab.h>
     19
     20#define TAPE_DBF_AREA	tape_34xx_dbf
     21
     22#include "tape.h"
     23#include "tape_std.h"
     24
     25/*
     26 * Pointer to debug area.
     27 */
     28debug_info_t *TAPE_DBF_AREA = NULL;
     29EXPORT_SYMBOL(TAPE_DBF_AREA);
     30
     31#define TAPE34XX_FMT_3480	0
     32#define TAPE34XX_FMT_3480_2_XF	1
     33#define TAPE34XX_FMT_3480_XF	2
     34
     35struct tape_34xx_block_id {
     36	unsigned int	wrap		: 1;
     37	unsigned int	segment		: 7;
     38	unsigned int	format		: 2;
     39	unsigned int	block		: 22;
     40};
     41
     42/*
     43 * A list of block ID's is used to faster seek blocks.
     44 */
     45struct tape_34xx_sbid {
     46	struct list_head		list;
     47	struct tape_34xx_block_id	bid;
     48};
     49
     50static void tape_34xx_delete_sbid_from(struct tape_device *, int);
     51
     52/*
     53 * Medium sense for 34xx tapes. There is no 'real' medium sense call.
     54 * So we just do a normal sense.
     55 */
     56static void __tape_34xx_medium_sense(struct tape_request *request)
     57{
     58	struct tape_device *device = request->device;
     59	unsigned char *sense;
     60
     61	if (request->rc == 0) {
     62		sense = request->cpdata;
     63
     64		/*
     65		 * This isn't quite correct. But since INTERVENTION_REQUIRED
     66		 * means that the drive is 'neither ready nor on-line' it is
     67		 * only slightly inaccurate to say there is no tape loaded if
     68		 * the drive isn't online...
     69		 */
     70		if (sense[0] & SENSE_INTERVENTION_REQUIRED)
     71			tape_med_state_set(device, MS_UNLOADED);
     72		else
     73			tape_med_state_set(device, MS_LOADED);
     74
     75		if (sense[1] & SENSE_WRITE_PROTECT)
     76			device->tape_generic_status |= GMT_WR_PROT(~0);
     77		else
     78			device->tape_generic_status &= ~GMT_WR_PROT(~0);
     79	} else
     80		DBF_EVENT(4, "tape_34xx: medium sense failed with rc=%d\n",
     81			request->rc);
     82	tape_free_request(request);
     83}
     84
     85static int tape_34xx_medium_sense(struct tape_device *device)
     86{
     87	struct tape_request *request;
     88	int rc;
     89
     90	request = tape_alloc_request(1, 32);
     91	if (IS_ERR(request)) {
     92		DBF_EXCEPTION(6, "MSEN fail\n");
     93		return PTR_ERR(request);
     94	}
     95
     96	request->op = TO_MSEN;
     97	tape_ccw_end(request->cpaddr, SENSE, 32, request->cpdata);
     98	rc = tape_do_io_interruptible(device, request);
     99	__tape_34xx_medium_sense(request);
    100	return rc;
    101}
    102
    103static void tape_34xx_medium_sense_async(struct tape_device *device)
    104{
    105	struct tape_request *request;
    106
    107	request = tape_alloc_request(1, 32);
    108	if (IS_ERR(request)) {
    109		DBF_EXCEPTION(6, "MSEN fail\n");
    110		return;
    111	}
    112
    113	request->op = TO_MSEN;
    114	tape_ccw_end(request->cpaddr, SENSE, 32, request->cpdata);
    115	request->callback = (void *) __tape_34xx_medium_sense;
    116	request->callback_data = NULL;
    117	tape_do_io_async(device, request);
    118}
    119
    120struct tape_34xx_work {
    121	struct tape_device	*device;
    122	enum tape_op		 op;
    123	struct work_struct	 work;
    124};
    125
    126/*
    127 * These functions are currently used only to schedule a medium_sense for
    128 * later execution. This is because we get an interrupt whenever a medium
    129 * is inserted but cannot call tape_do_io* from an interrupt context.
    130 * Maybe that's useful for other actions we want to start from the
    131 * interrupt handler.
    132 * Note: the work handler is called by the system work queue. The tape
    133 * commands started by the handler need to be asynchrounous, otherwise
    134 * a deadlock can occur e.g. in case of a deferred cc=1 (see __tape_do_irq).
    135 */
    136static void
    137tape_34xx_work_handler(struct work_struct *work)
    138{
    139	struct tape_34xx_work *p =
    140		container_of(work, struct tape_34xx_work, work);
    141	struct tape_device *device = p->device;
    142
    143	switch(p->op) {
    144		case TO_MSEN:
    145			tape_34xx_medium_sense_async(device);
    146			break;
    147		default:
    148			DBF_EVENT(3, "T34XX: internal error: unknown work\n");
    149	}
    150	tape_put_device(device);
    151	kfree(p);
    152}
    153
    154static int
    155tape_34xx_schedule_work(struct tape_device *device, enum tape_op op)
    156{
    157	struct tape_34xx_work *p;
    158
    159	if ((p = kzalloc(sizeof(*p), GFP_ATOMIC)) == NULL)
    160		return -ENOMEM;
    161
    162	INIT_WORK(&p->work, tape_34xx_work_handler);
    163
    164	p->device = tape_get_device(device);
    165	p->op     = op;
    166
    167	schedule_work(&p->work);
    168	return 0;
    169}
    170
    171/*
    172 * Done Handler is called when dev stat = DEVICE-END (successful operation)
    173 */
    174static inline int
    175tape_34xx_done(struct tape_request *request)
    176{
    177	DBF_EVENT(6, "%s done\n", tape_op_verbose[request->op]);
    178
    179	switch (request->op) {
    180		case TO_DSE:
    181		case TO_RUN:
    182		case TO_WRI:
    183		case TO_WTM:
    184		case TO_ASSIGN:
    185		case TO_UNASSIGN:
    186			tape_34xx_delete_sbid_from(request->device, 0);
    187			break;
    188		default:
    189			;
    190	}
    191	return TAPE_IO_SUCCESS;
    192}
    193
    194static inline int
    195tape_34xx_erp_failed(struct tape_request *request, int rc)
    196{
    197	DBF_EVENT(3, "Error recovery failed for %s (RC=%d)\n",
    198		  tape_op_verbose[request->op], rc);
    199	return rc;
    200}
    201
    202static inline int
    203tape_34xx_erp_succeeded(struct tape_request *request)
    204{
    205	DBF_EVENT(3, "Error Recovery successful for %s\n",
    206		  tape_op_verbose[request->op]);
    207	return tape_34xx_done(request);
    208}
    209
    210static inline int
    211tape_34xx_erp_retry(struct tape_request *request)
    212{
    213	DBF_EVENT(3, "xerp retr %s\n", tape_op_verbose[request->op]);
    214	return TAPE_IO_RETRY;
    215}
    216
    217/*
    218 * This function is called, when no request is outstanding and we get an
    219 * interrupt
    220 */
    221static int
    222tape_34xx_unsolicited_irq(struct tape_device *device, struct irb *irb)
    223{
    224	if (irb->scsw.cmd.dstat == 0x85) { /* READY */
    225		/* A medium was inserted in the drive. */
    226		DBF_EVENT(6, "xuud med\n");
    227		tape_34xx_delete_sbid_from(device, 0);
    228		tape_34xx_schedule_work(device, TO_MSEN);
    229	} else {
    230		DBF_EVENT(3, "unsol.irq! dev end: %08x\n", device->cdev_id);
    231		tape_dump_sense_dbf(device, NULL, irb);
    232	}
    233	return TAPE_IO_SUCCESS;
    234}
    235
    236/*
    237 * Read Opposite Error Recovery Function:
    238 * Used, when Read Forward does not work
    239 */
    240static int
    241tape_34xx_erp_read_opposite(struct tape_device *device,
    242			    struct tape_request *request)
    243{
    244	if (request->op == TO_RFO) {
    245		/*
    246		 * We did read forward, but the data could not be read
    247		 * *correctly*. We transform the request to a read backward
    248		 * and try again.
    249		 */
    250		tape_std_read_backward(device, request);
    251		return tape_34xx_erp_retry(request);
    252	}
    253
    254	/*
    255	 * We tried to read forward and backward, but hat no
    256	 * success -> failed.
    257	 */
    258	return tape_34xx_erp_failed(request, -EIO);
    259}
    260
    261static int
    262tape_34xx_erp_bug(struct tape_device *device, struct tape_request *request,
    263		  struct irb *irb, int no)
    264{
    265	if (request->op != TO_ASSIGN) {
    266		dev_err(&device->cdev->dev, "An unexpected condition %d "
    267			"occurred in tape error recovery\n", no);
    268		tape_dump_sense_dbf(device, request, irb);
    269	}
    270	return tape_34xx_erp_failed(request, -EIO);
    271}
    272
    273/*
    274 * Handle data overrun between cu and drive. The channel speed might
    275 * be too slow.
    276 */
    277static int
    278tape_34xx_erp_overrun(struct tape_device *device, struct tape_request *request,
    279		      struct irb *irb)
    280{
    281	if (irb->ecw[3] == 0x40) {
    282		dev_warn (&device->cdev->dev, "A data overrun occurred between"
    283			" the control unit and tape unit\n");
    284		return tape_34xx_erp_failed(request, -EIO);
    285	}
    286	return tape_34xx_erp_bug(device, request, irb, -1);
    287}
    288
    289/*
    290 * Handle record sequence error.
    291 */
    292static int
    293tape_34xx_erp_sequence(struct tape_device *device,
    294		       struct tape_request *request, struct irb *irb)
    295{
    296	if (irb->ecw[3] == 0x41) {
    297		/*
    298		 * cu detected incorrect block-id sequence on tape.
    299		 */
    300		dev_warn (&device->cdev->dev, "The block ID sequence on the "
    301			"tape is incorrect\n");
    302		return tape_34xx_erp_failed(request, -EIO);
    303	}
    304	/*
    305	 * Record sequence error bit is set, but erpa does not
    306	 * show record sequence error.
    307	 */
    308	return tape_34xx_erp_bug(device, request, irb, -2);
    309}
    310
    311/*
    312 * This function analyses the tape's sense-data in case of a unit-check.
    313 * If possible, it tries to recover from the error. Else the user is
    314 * informed about the problem.
    315 */
    316static int
    317tape_34xx_unit_check(struct tape_device *device, struct tape_request *request,
    318		     struct irb *irb)
    319{
    320	int inhibit_cu_recovery;
    321	__u8* sense;
    322
    323	inhibit_cu_recovery = (*device->modeset_byte & 0x80) ? 1 : 0;
    324	sense = irb->ecw;
    325
    326	if (
    327		sense[0] & SENSE_COMMAND_REJECT &&
    328		sense[1] & SENSE_WRITE_PROTECT
    329	) {
    330		if (
    331			request->op == TO_DSE ||
    332			request->op == TO_WRI ||
    333			request->op == TO_WTM
    334		) {
    335			/* medium is write protected */
    336			return tape_34xx_erp_failed(request, -EACCES);
    337		} else {
    338			return tape_34xx_erp_bug(device, request, irb, -3);
    339		}
    340	}
    341
    342	/*
    343	 * Special cases for various tape-states when reaching
    344	 * end of recorded area
    345	 *
    346	 * FIXME: Maybe a special case of the special case:
    347	 *        sense[0] == SENSE_EQUIPMENT_CHECK &&
    348	 *        sense[1] == SENSE_DRIVE_ONLINE    &&
    349	 *        sense[3] == 0x47 (Volume Fenced)
    350	 *
    351	 *        This was caused by continued FSF or FSR after an
    352	 *        'End Of Data'.
    353	 */
    354	if ((
    355		sense[0] == SENSE_DATA_CHECK      ||
    356		sense[0] == SENSE_EQUIPMENT_CHECK ||
    357		sense[0] == (SENSE_EQUIPMENT_CHECK | SENSE_DEFERRED_UNIT_CHECK)
    358	) && (
    359		sense[1] == SENSE_DRIVE_ONLINE ||
    360		sense[1] == (SENSE_BEGINNING_OF_TAPE | SENSE_WRITE_MODE)
    361	)) {
    362		switch (request->op) {
    363		/*
    364		 * sense[0] == SENSE_DATA_CHECK   &&
    365		 * sense[1] == SENSE_DRIVE_ONLINE
    366		 * sense[3] == 0x36 (End Of Data)
    367		 *
    368		 * Further seeks might return a 'Volume Fenced'.
    369		 */
    370		case TO_FSF:
    371		case TO_FSB:
    372			/* Trying to seek beyond end of recorded area */
    373			return tape_34xx_erp_failed(request, -ENOSPC);
    374		case TO_BSB:
    375			return tape_34xx_erp_retry(request);
    376
    377		/*
    378		 * sense[0] == SENSE_DATA_CHECK   &&
    379		 * sense[1] == SENSE_DRIVE_ONLINE &&
    380		 * sense[3] == 0x36 (End Of Data)
    381		 */
    382		case TO_LBL:
    383			/* Block could not be located. */
    384			tape_34xx_delete_sbid_from(device, 0);
    385			return tape_34xx_erp_failed(request, -EIO);
    386
    387		case TO_RFO:
    388			/* Read beyond end of recorded area -> 0 bytes read */
    389			return tape_34xx_erp_failed(request, 0);
    390
    391		/*
    392		 * sense[0] == SENSE_EQUIPMENT_CHECK &&
    393		 * sense[1] == SENSE_DRIVE_ONLINE    &&
    394		 * sense[3] == 0x38 (Physical End Of Volume)
    395		 */
    396		case TO_WRI:
    397			/* Writing at physical end of volume */
    398			return tape_34xx_erp_failed(request, -ENOSPC);
    399		default:
    400			return tape_34xx_erp_failed(request, 0);
    401		}
    402	}
    403
    404	/* Sensing special bits */
    405	if (sense[0] & SENSE_BUS_OUT_CHECK)
    406		return tape_34xx_erp_retry(request);
    407
    408	if (sense[0] & SENSE_DATA_CHECK) {
    409		/*
    410		 * hardware failure, damaged tape or improper
    411		 * operating conditions
    412		 */
    413		switch (sense[3]) {
    414		case 0x23:
    415			/* a read data check occurred */
    416			if ((sense[2] & SENSE_TAPE_SYNC_MODE) ||
    417			    inhibit_cu_recovery)
    418				// data check is not permanent, may be
    419				// recovered. We always use async-mode with
    420				// cu-recovery, so this should *never* happen.
    421				return tape_34xx_erp_bug(device, request,
    422							 irb, -4);
    423
    424			/* data check is permanent, CU recovery has failed */
    425			dev_warn (&device->cdev->dev, "A read error occurred "
    426				"that cannot be recovered\n");
    427			return tape_34xx_erp_failed(request, -EIO);
    428		case 0x25:
    429			// a write data check occurred
    430			if ((sense[2] & SENSE_TAPE_SYNC_MODE) ||
    431			    inhibit_cu_recovery)
    432				// data check is not permanent, may be
    433				// recovered. We always use async-mode with
    434				// cu-recovery, so this should *never* happen.
    435				return tape_34xx_erp_bug(device, request,
    436							 irb, -5);
    437
    438			// data check is permanent, cu-recovery has failed
    439			dev_warn (&device->cdev->dev, "A write error on the "
    440				"tape cannot be recovered\n");
    441			return tape_34xx_erp_failed(request, -EIO);
    442		case 0x26:
    443			/* Data Check (read opposite) occurred. */
    444			return tape_34xx_erp_read_opposite(device, request);
    445		case 0x28:
    446			/* ID-Mark at tape start couldn't be written */
    447			dev_warn (&device->cdev->dev, "Writing the ID-mark "
    448				"failed\n");
    449			return tape_34xx_erp_failed(request, -EIO);
    450		case 0x31:
    451			/* Tape void. Tried to read beyond end of device. */
    452			dev_warn (&device->cdev->dev, "Reading the tape beyond"
    453				" the end of the recorded area failed\n");
    454			return tape_34xx_erp_failed(request, -ENOSPC);
    455		case 0x41:
    456			/* Record sequence error. */
    457			dev_warn (&device->cdev->dev, "The tape contains an "
    458				"incorrect block ID sequence\n");
    459			return tape_34xx_erp_failed(request, -EIO);
    460		default:
    461			/* all data checks for 3480 should result in one of
    462			 * the above erpa-codes. For 3490, other data-check
    463			 * conditions do exist. */
    464			if (device->cdev->id.driver_info == tape_3480)
    465				return tape_34xx_erp_bug(device, request,
    466							 irb, -6);
    467		}
    468	}
    469
    470	if (sense[0] & SENSE_OVERRUN)
    471		return tape_34xx_erp_overrun(device, request, irb);
    472
    473	if (sense[1] & SENSE_RECORD_SEQUENCE_ERR)
    474		return tape_34xx_erp_sequence(device, request, irb);
    475
    476	/* Sensing erpa codes */
    477	switch (sense[3]) {
    478	case 0x00:
    479		/* Unit check with erpa code 0. Report and ignore. */
    480		return TAPE_IO_SUCCESS;
    481	case 0x21:
    482		/*
    483		 * Data streaming not operational. CU will switch to
    484		 * interlock mode. Reissue the command.
    485		 */
    486		return tape_34xx_erp_retry(request);
    487	case 0x22:
    488		/*
    489		 * Path equipment check. Might be drive adapter error, buffer
    490		 * error on the lower interface, internal path not usable,
    491		 * or error during cartridge load.
    492		 */
    493		dev_warn (&device->cdev->dev, "A path equipment check occurred"
    494			" for the tape device\n");
    495		return tape_34xx_erp_failed(request, -EIO);
    496	case 0x24:
    497		/*
    498		 * Load display check. Load display was command was issued,
    499		 * but the drive is displaying a drive check message. Can
    500		 * be threated as "device end".
    501		 */
    502		return tape_34xx_erp_succeeded(request);
    503	case 0x27:
    504		/*
    505		 * Command reject. May indicate illegal channel program or
    506		 * buffer over/underrun. Since all channel programs are
    507		 * issued by this driver and ought be correct, we assume a
    508		 * over/underrun situation and retry the channel program.
    509		 */
    510		return tape_34xx_erp_retry(request);
    511	case 0x29:
    512		/*
    513		 * Function incompatible. Either the tape is idrc compressed
    514		 * but the hardware isn't capable to do idrc, or a perform
    515		 * subsystem func is issued and the CU is not on-line.
    516		 */
    517		return tape_34xx_erp_failed(request, -EIO);
    518	case 0x2a:
    519		/*
    520		 * Unsolicited environmental data. An internal counter
    521		 * overflows, we can ignore this and reissue the cmd.
    522		 */
    523		return tape_34xx_erp_retry(request);
    524	case 0x2b:
    525		/*
    526		 * Environmental data present. Indicates either unload
    527		 * completed ok or read buffered log command completed ok.
    528		 */
    529		if (request->op == TO_RUN) {
    530			/* Rewind unload completed ok. */
    531			tape_med_state_set(device, MS_UNLOADED);
    532			return tape_34xx_erp_succeeded(request);
    533		}
    534		/* tape_34xx doesn't use read buffered log commands. */
    535		return tape_34xx_erp_bug(device, request, irb, sense[3]);
    536	case 0x2c:
    537		/*
    538		 * Permanent equipment check. CU has tried recovery, but
    539		 * did not succeed.
    540		 */
    541		return tape_34xx_erp_failed(request, -EIO);
    542	case 0x2d:
    543		/* Data security erase failure. */
    544		if (request->op == TO_DSE)
    545			return tape_34xx_erp_failed(request, -EIO);
    546		/* Data security erase failure, but no such command issued. */
    547		return tape_34xx_erp_bug(device, request, irb, sense[3]);
    548	case 0x2e:
    549		/*
    550		 * Not capable. This indicates either that the drive fails
    551		 * reading the format id mark or that that format specified
    552		 * is not supported by the drive.
    553		 */
    554		dev_warn (&device->cdev->dev, "The tape unit cannot process "
    555			"the tape format\n");
    556		return tape_34xx_erp_failed(request, -EMEDIUMTYPE);
    557	case 0x30:
    558		/* The medium is write protected. */
    559		dev_warn (&device->cdev->dev, "The tape medium is write-"
    560			"protected\n");
    561		return tape_34xx_erp_failed(request, -EACCES);
    562	case 0x32:
    563		// Tension loss. We cannot recover this, it's an I/O error.
    564		dev_warn (&device->cdev->dev, "The tape does not have the "
    565			"required tape tension\n");
    566		return tape_34xx_erp_failed(request, -EIO);
    567	case 0x33:
    568		/*
    569		 * Load Failure. The cartridge was not inserted correctly or
    570		 * the tape is not threaded correctly.
    571		 */
    572		dev_warn (&device->cdev->dev, "The tape unit failed to load"
    573			" the cartridge\n");
    574		tape_34xx_delete_sbid_from(device, 0);
    575		return tape_34xx_erp_failed(request, -EIO);
    576	case 0x34:
    577		/*
    578		 * Unload failure. The drive cannot maintain tape tension
    579		 * and control tape movement during an unload operation.
    580		 */
    581		dev_warn (&device->cdev->dev, "Automatic unloading of the tape"
    582			" cartridge failed\n");
    583		if (request->op == TO_RUN)
    584			return tape_34xx_erp_failed(request, -EIO);
    585		return tape_34xx_erp_bug(device, request, irb, sense[3]);
    586	case 0x35:
    587		/*
    588		 * Drive equipment check. One of the following:
    589		 * - cu cannot recover from a drive detected error
    590		 * - a check code message is shown on drive display
    591		 * - the cartridge loader does not respond correctly
    592		 * - a failure occurs during an index, load, or unload cycle
    593		 */
    594		dev_warn (&device->cdev->dev, "An equipment check has occurred"
    595			" on the tape unit\n");
    596		return tape_34xx_erp_failed(request, -EIO);
    597	case 0x36:
    598		if (device->cdev->id.driver_info == tape_3490)
    599			/* End of data. */
    600			return tape_34xx_erp_failed(request, -EIO);
    601		/* This erpa is reserved for 3480 */
    602		return tape_34xx_erp_bug(device, request, irb, sense[3]);
    603	case 0x37:
    604		/*
    605		 * Tape length error. The tape is shorter than reported in
    606		 * the beginning-of-tape data.
    607		 */
    608		dev_warn (&device->cdev->dev, "The tape information states an"
    609			" incorrect length\n");
    610		return tape_34xx_erp_failed(request, -EIO);
    611	case 0x38:
    612		/*
    613		 * Physical end of tape. A read/write operation reached
    614		 * the physical end of tape.
    615		 */
    616		if (request->op==TO_WRI ||
    617		    request->op==TO_DSE ||
    618		    request->op==TO_WTM)
    619			return tape_34xx_erp_failed(request, -ENOSPC);
    620		return tape_34xx_erp_failed(request, -EIO);
    621	case 0x39:
    622		/* Backward at Beginning of tape. */
    623		return tape_34xx_erp_failed(request, -EIO);
    624	case 0x3a:
    625		/* Drive switched to not ready. */
    626		dev_warn (&device->cdev->dev, "The tape unit is not ready\n");
    627		return tape_34xx_erp_failed(request, -EIO);
    628	case 0x3b:
    629		/* Manual rewind or unload. This causes an I/O error. */
    630		dev_warn (&device->cdev->dev, "The tape medium has been "
    631			"rewound or unloaded manually\n");
    632		tape_34xx_delete_sbid_from(device, 0);
    633		return tape_34xx_erp_failed(request, -EIO);
    634	case 0x42:
    635		/*
    636		 * Degraded mode. A condition that can cause degraded
    637		 * performance is detected.
    638		 */
    639		dev_warn (&device->cdev->dev, "The tape subsystem is running "
    640			"in degraded mode\n");
    641		return tape_34xx_erp_retry(request);
    642	case 0x43:
    643		/* Drive not ready. */
    644		tape_34xx_delete_sbid_from(device, 0);
    645		tape_med_state_set(device, MS_UNLOADED);
    646		/* Some commands commands are successful even in this case */
    647		if (sense[1] & SENSE_DRIVE_ONLINE) {
    648			switch(request->op) {
    649				case TO_ASSIGN:
    650				case TO_UNASSIGN:
    651				case TO_DIS:
    652				case TO_NOP:
    653					return tape_34xx_done(request);
    654					break;
    655				default:
    656					break;
    657			}
    658		}
    659		return tape_34xx_erp_failed(request, -ENOMEDIUM);
    660	case 0x44:
    661		/* Locate Block unsuccessful. */
    662		if (request->op != TO_BLOCK && request->op != TO_LBL)
    663			/* No locate block was issued. */
    664			return tape_34xx_erp_bug(device, request,
    665						 irb, sense[3]);
    666		return tape_34xx_erp_failed(request, -EIO);
    667	case 0x45:
    668		/* The drive is assigned to a different channel path. */
    669		dev_warn (&device->cdev->dev, "The tape unit is already "
    670			"assigned\n");
    671		return tape_34xx_erp_failed(request, -EIO);
    672	case 0x46:
    673		/*
    674		 * Drive not on-line. Drive may be switched offline,
    675		 * the power supply may be switched off or
    676		 * the drive address may not be set correctly.
    677		 */
    678		dev_warn (&device->cdev->dev, "The tape unit is not online\n");
    679		return tape_34xx_erp_failed(request, -EIO);
    680	case 0x47:
    681		/* Volume fenced. CU reports volume integrity is lost. */
    682		dev_warn (&device->cdev->dev, "The control unit has fenced "
    683			"access to the tape volume\n");
    684		tape_34xx_delete_sbid_from(device, 0);
    685		return tape_34xx_erp_failed(request, -EIO);
    686	case 0x48:
    687		/* Log sense data and retry request. */
    688		return tape_34xx_erp_retry(request);
    689	case 0x49:
    690		/* Bus out check. A parity check error on the bus was found. */
    691		dev_warn (&device->cdev->dev, "A parity error occurred on the "
    692			"tape bus\n");
    693		return tape_34xx_erp_failed(request, -EIO);
    694	case 0x4a:
    695		/* Control unit erp failed. */
    696		dev_warn (&device->cdev->dev, "I/O error recovery failed on "
    697			"the tape control unit\n");
    698		return tape_34xx_erp_failed(request, -EIO);
    699	case 0x4b:
    700		/*
    701		 * CU and drive incompatible. The drive requests micro-program
    702		 * patches, which are not available on the CU.
    703		 */
    704		dev_warn (&device->cdev->dev, "The tape unit requires a "
    705			"firmware update\n");
    706		return tape_34xx_erp_failed(request, -EIO);
    707	case 0x4c:
    708		/*
    709		 * Recovered Check-One failure. Cu develops a hardware error,
    710		 * but is able to recover.
    711		 */
    712		return tape_34xx_erp_retry(request);
    713	case 0x4d:
    714		if (device->cdev->id.driver_info == tape_3490)
    715			/*
    716			 * Resetting event received. Since the driver does
    717			 * not support resetting event recovery (which has to
    718			 * be handled by the I/O Layer), retry our command.
    719			 */
    720			return tape_34xx_erp_retry(request);
    721		/* This erpa is reserved for 3480. */
    722		return tape_34xx_erp_bug(device, request, irb, sense[3]);
    723	case 0x4e:
    724		if (device->cdev->id.driver_info == tape_3490) {
    725			/*
    726			 * Maximum block size exceeded. This indicates, that
    727			 * the block to be written is larger than allowed for
    728			 * buffered mode.
    729			 */
    730			dev_warn (&device->cdev->dev, "The maximum block size"
    731				" for buffered mode is exceeded\n");
    732			return tape_34xx_erp_failed(request, -ENOBUFS);
    733		}
    734		/* This erpa is reserved for 3480. */
    735		return tape_34xx_erp_bug(device, request, irb, sense[3]);
    736	case 0x50:
    737		/*
    738		 * Read buffered log (Overflow). CU is running in extended
    739		 * buffered log mode, and a counter overflows. This should
    740		 * never happen, since we're never running in extended
    741		 * buffered log mode.
    742		 */
    743		return tape_34xx_erp_retry(request);
    744	case 0x51:
    745		/*
    746		 * Read buffered log (EOV). EOF processing occurs while the
    747		 * CU is in extended buffered log mode. This should never
    748		 * happen, since we're never running in extended buffered
    749		 * log mode.
    750		 */
    751		return tape_34xx_erp_retry(request);
    752	case 0x52:
    753		/* End of Volume complete. Rewind unload completed ok. */
    754		if (request->op == TO_RUN) {
    755			tape_med_state_set(device, MS_UNLOADED);
    756			tape_34xx_delete_sbid_from(device, 0);
    757			return tape_34xx_erp_succeeded(request);
    758		}
    759		return tape_34xx_erp_bug(device, request, irb, sense[3]);
    760	case 0x53:
    761		/* Global command intercept. */
    762		return tape_34xx_erp_retry(request);
    763	case 0x54:
    764		/* Channel interface recovery (temporary). */
    765		return tape_34xx_erp_retry(request);
    766	case 0x55:
    767		/* Channel interface recovery (permanent). */
    768		dev_warn (&device->cdev->dev, "A channel interface error cannot be"
    769			" recovered\n");
    770		return tape_34xx_erp_failed(request, -EIO);
    771	case 0x56:
    772		/* Channel protocol error. */
    773		dev_warn (&device->cdev->dev, "A channel protocol error "
    774			"occurred\n");
    775		return tape_34xx_erp_failed(request, -EIO);
    776	case 0x57:
    777		/*
    778		 * 3480: Attention intercept.
    779		 * 3490: Global status intercept.
    780		 */
    781		return tape_34xx_erp_retry(request);
    782	case 0x5a:
    783		/*
    784		 * Tape length incompatible. The tape inserted is too long,
    785		 * which could cause damage to the tape or the drive.
    786		 */
    787		dev_warn (&device->cdev->dev, "The tape unit does not support "
    788			"the tape length\n");
    789		return tape_34xx_erp_failed(request, -EIO);
    790	case 0x5b:
    791		/* Format 3480 XF incompatible */
    792		if (sense[1] & SENSE_BEGINNING_OF_TAPE)
    793			/* The tape will get overwritten. */
    794			return tape_34xx_erp_retry(request);
    795		dev_warn (&device->cdev->dev, "The tape unit does not support"
    796			" format 3480 XF\n");
    797		return tape_34xx_erp_failed(request, -EIO);
    798	case 0x5c:
    799		/* Format 3480-2 XF incompatible */
    800		dev_warn (&device->cdev->dev, "The tape unit does not support tape "
    801			"format 3480-2 XF\n");
    802		return tape_34xx_erp_failed(request, -EIO);
    803	case 0x5d:
    804		/* Tape length violation. */
    805		dev_warn (&device->cdev->dev, "The tape unit does not support"
    806			" the current tape length\n");
    807		return tape_34xx_erp_failed(request, -EMEDIUMTYPE);
    808	case 0x5e:
    809		/* Compaction algorithm incompatible. */
    810		dev_warn (&device->cdev->dev, "The tape unit does not support"
    811			" the compaction algorithm\n");
    812		return tape_34xx_erp_failed(request, -EMEDIUMTYPE);
    813
    814		/* The following erpas should have been covered earlier. */
    815	case 0x23: /* Read data check. */
    816	case 0x25: /* Write data check. */
    817	case 0x26: /* Data check (read opposite). */
    818	case 0x28: /* Write id mark check. */
    819	case 0x31: /* Tape void. */
    820	case 0x40: /* Overrun error. */
    821	case 0x41: /* Record sequence error. */
    822		/* All other erpas are reserved for future use. */
    823	default:
    824		return tape_34xx_erp_bug(device, request, irb, sense[3]);
    825	}
    826}
    827
    828/*
    829 * 3480/3490 interrupt handler
    830 */
    831static int
    832tape_34xx_irq(struct tape_device *device, struct tape_request *request,
    833	      struct irb *irb)
    834{
    835	if (request == NULL)
    836		return tape_34xx_unsolicited_irq(device, irb);
    837
    838	if ((irb->scsw.cmd.dstat & DEV_STAT_UNIT_EXCEP) &&
    839	    (irb->scsw.cmd.dstat & DEV_STAT_DEV_END) &&
    840	    (request->op == TO_WRI)) {
    841		/* Write at end of volume */
    842		return tape_34xx_erp_failed(request, -ENOSPC);
    843	}
    844
    845	if (irb->scsw.cmd.dstat & DEV_STAT_UNIT_CHECK)
    846		return tape_34xx_unit_check(device, request, irb);
    847
    848	if (irb->scsw.cmd.dstat & DEV_STAT_DEV_END) {
    849		/*
    850		 * A unit exception occurs on skipping over a tapemark block.
    851		 */
    852		if (irb->scsw.cmd.dstat & DEV_STAT_UNIT_EXCEP) {
    853			if (request->op == TO_BSB || request->op == TO_FSB)
    854				request->rescnt++;
    855			else
    856				DBF_EVENT(5, "Unit Exception!\n");
    857		}
    858		return tape_34xx_done(request);
    859	}
    860
    861	DBF_EVENT(6, "xunknownirq\n");
    862	tape_dump_sense_dbf(device, request, irb);
    863	return TAPE_IO_STOP;
    864}
    865
    866/*
    867 * ioctl_overload
    868 */
    869static int
    870tape_34xx_ioctl(struct tape_device *device, unsigned int cmd, unsigned long arg)
    871{
    872	if (cmd == TAPE390_DISPLAY) {
    873		struct display_struct disp;
    874
    875		if (copy_from_user(&disp, (char __user *) arg, sizeof(disp)) != 0)
    876			return -EFAULT;
    877
    878		return tape_std_display(device, &disp);
    879	} else
    880		return -EINVAL;
    881}
    882
    883static inline void
    884tape_34xx_append_new_sbid(struct tape_34xx_block_id bid, struct list_head *l)
    885{
    886	struct tape_34xx_sbid *	new_sbid;
    887
    888	new_sbid = kmalloc(sizeof(*new_sbid), GFP_ATOMIC);
    889	if (!new_sbid)
    890		return;
    891
    892	new_sbid->bid = bid;
    893	list_add(&new_sbid->list, l);
    894}
    895
    896/*
    897 * Build up the search block ID list. The block ID consists of a logical
    898 * block number and a hardware specific part. The hardware specific part
    899 * helps the tape drive to speed up searching for a specific block.
    900 */
    901static void
    902tape_34xx_add_sbid(struct tape_device *device, struct tape_34xx_block_id bid)
    903{
    904	struct list_head *	sbid_list;
    905	struct tape_34xx_sbid *	sbid;
    906	struct list_head *	l;
    907
    908	/*
    909	 * immediately return if there is no list at all or the block to add
    910	 * is located in segment 1 of wrap 0 because this position is used
    911	 * if no hardware position data is supplied.
    912	 */
    913	sbid_list = (struct list_head *) device->discdata;
    914	if (!sbid_list || (bid.segment < 2 && bid.wrap == 0))
    915		return;
    916
    917	/*
    918	 * Search the position where to insert the new entry. Hardware
    919	 * acceleration uses only the segment and wrap number. So we
    920	 * need only one entry for a specific wrap/segment combination.
    921	 * If there is a block with a lower number but the same hard-
    922	 * ware position data we just update the block number in the
    923	 * existing entry.
    924	 */
    925	list_for_each(l, sbid_list) {
    926		sbid = list_entry(l, struct tape_34xx_sbid, list);
    927
    928		if (
    929			(sbid->bid.segment == bid.segment) &&
    930			(sbid->bid.wrap    == bid.wrap)
    931		) {
    932			if (bid.block < sbid->bid.block)
    933				sbid->bid = bid;
    934			else return;
    935			break;
    936		}
    937
    938		/* Sort in according to logical block number. */
    939		if (bid.block < sbid->bid.block) {
    940			tape_34xx_append_new_sbid(bid, l->prev);
    941			break;
    942		}
    943	}
    944	/* List empty or new block bigger than last entry. */
    945	if (l == sbid_list)
    946		tape_34xx_append_new_sbid(bid, l->prev);
    947
    948	DBF_LH(4, "Current list is:\n");
    949	list_for_each(l, sbid_list) {
    950		sbid = list_entry(l, struct tape_34xx_sbid, list);
    951		DBF_LH(4, "%d:%03d@%05d\n",
    952			sbid->bid.wrap,
    953			sbid->bid.segment,
    954			sbid->bid.block
    955		);
    956	}
    957}
    958
    959/*
    960 * Delete all entries from the search block ID list that belong to tape blocks
    961 * equal or higher than the given number.
    962 */
    963static void
    964tape_34xx_delete_sbid_from(struct tape_device *device, int from)
    965{
    966	struct list_head *	sbid_list;
    967	struct tape_34xx_sbid *	sbid;
    968	struct list_head *	l;
    969	struct list_head *	n;
    970
    971	sbid_list = (struct list_head *) device->discdata;
    972	if (!sbid_list)
    973		return;
    974
    975	list_for_each_safe(l, n, sbid_list) {
    976		sbid = list_entry(l, struct tape_34xx_sbid, list);
    977		if (sbid->bid.block >= from) {
    978			DBF_LH(4, "Delete sbid %d:%03d@%05d\n",
    979				sbid->bid.wrap,
    980				sbid->bid.segment,
    981				sbid->bid.block
    982			);
    983			list_del(l);
    984			kfree(sbid);
    985		}
    986	}
    987}
    988
    989/*
    990 * Merge hardware position data into a block id.
    991 */
    992static void
    993tape_34xx_merge_sbid(
    994	struct tape_device *		device,
    995	struct tape_34xx_block_id *	bid
    996) {
    997	struct tape_34xx_sbid *	sbid;
    998	struct tape_34xx_sbid *	sbid_to_use;
    999	struct list_head *	sbid_list;
   1000	struct list_head *	l;
   1001
   1002	sbid_list = (struct list_head *) device->discdata;
   1003	bid->wrap    = 0;
   1004	bid->segment = 1;
   1005
   1006	if (!sbid_list || list_empty(sbid_list))
   1007		return;
   1008
   1009	sbid_to_use = NULL;
   1010	list_for_each(l, sbid_list) {
   1011		sbid = list_entry(l, struct tape_34xx_sbid, list);
   1012
   1013		if (sbid->bid.block >= bid->block)
   1014			break;
   1015		sbid_to_use = sbid;
   1016	}
   1017	if (sbid_to_use) {
   1018		bid->wrap    = sbid_to_use->bid.wrap;
   1019		bid->segment = sbid_to_use->bid.segment;
   1020		DBF_LH(4, "Use %d:%03d@%05d for %05d\n",
   1021			sbid_to_use->bid.wrap,
   1022			sbid_to_use->bid.segment,
   1023			sbid_to_use->bid.block,
   1024			bid->block
   1025		);
   1026	}
   1027}
   1028
   1029static int
   1030tape_34xx_setup_device(struct tape_device * device)
   1031{
   1032	int			rc;
   1033	struct list_head *	discdata;
   1034
   1035	DBF_EVENT(6, "34xx device setup\n");
   1036	if ((rc = tape_std_assign(device)) == 0) {
   1037		if ((rc = tape_34xx_medium_sense(device)) != 0) {
   1038			DBF_LH(3, "34xx medium sense returned %d\n", rc);
   1039		}
   1040	}
   1041	discdata = kmalloc(sizeof(struct list_head), GFP_KERNEL);
   1042	if (discdata) {
   1043			INIT_LIST_HEAD(discdata);
   1044			device->discdata = discdata;
   1045	}
   1046
   1047	return rc;
   1048}
   1049
   1050static void
   1051tape_34xx_cleanup_device(struct tape_device *device)
   1052{
   1053	tape_std_unassign(device);
   1054	
   1055	if (device->discdata) {
   1056		tape_34xx_delete_sbid_from(device, 0);
   1057		kfree(device->discdata);
   1058		device->discdata = NULL;
   1059	}
   1060}
   1061
   1062
   1063/*
   1064 * MTTELL: Tell block. Return the number of block relative to current file.
   1065 */
   1066static int
   1067tape_34xx_mttell(struct tape_device *device, int mt_count)
   1068{
   1069	struct {
   1070		struct tape_34xx_block_id	cbid;
   1071		struct tape_34xx_block_id	dbid;
   1072	} __attribute__ ((packed)) block_id;
   1073	int rc;
   1074
   1075	rc = tape_std_read_block_id(device, (__u64 *) &block_id);
   1076	if (rc)
   1077		return rc;
   1078
   1079	tape_34xx_add_sbid(device, block_id.cbid);
   1080	return block_id.cbid.block;
   1081}
   1082
   1083/*
   1084 * MTSEEK: seek to the specified block.
   1085 */
   1086static int
   1087tape_34xx_mtseek(struct tape_device *device, int mt_count)
   1088{
   1089	struct tape_request *request;
   1090	struct tape_34xx_block_id *	bid;
   1091
   1092	if (mt_count > 0x3fffff) {
   1093		DBF_EXCEPTION(6, "xsee parm\n");
   1094		return -EINVAL;
   1095	}
   1096	request = tape_alloc_request(3, 4);
   1097	if (IS_ERR(request))
   1098		return PTR_ERR(request);
   1099
   1100	/* setup ccws */
   1101	request->op = TO_LBL;
   1102	bid         = (struct tape_34xx_block_id *) request->cpdata;
   1103	bid->format = (*device->modeset_byte & 0x08) ?
   1104			TAPE34XX_FMT_3480_XF : TAPE34XX_FMT_3480;
   1105	bid->block  = mt_count;
   1106	tape_34xx_merge_sbid(device, bid);
   1107
   1108	tape_ccw_cc(request->cpaddr, MODE_SET_DB, 1, device->modeset_byte);
   1109	tape_ccw_cc(request->cpaddr + 1, LOCATE, 4, request->cpdata);
   1110	tape_ccw_end(request->cpaddr + 2, NOP, 0, NULL);
   1111
   1112	/* execute it */
   1113	return tape_do_io_free(device, request);
   1114}
   1115
   1116/*
   1117 * List of 3480/3490 magnetic tape commands.
   1118 */
   1119static tape_mtop_fn tape_34xx_mtop[TAPE_NR_MTOPS] = {
   1120	[MTRESET]	 = tape_std_mtreset,
   1121	[MTFSF]		 = tape_std_mtfsf,
   1122	[MTBSF]		 = tape_std_mtbsf,
   1123	[MTFSR]		 = tape_std_mtfsr,
   1124	[MTBSR]		 = tape_std_mtbsr,
   1125	[MTWEOF]	 = tape_std_mtweof,
   1126	[MTREW]		 = tape_std_mtrew,
   1127	[MTOFFL]	 = tape_std_mtoffl,
   1128	[MTNOP]		 = tape_std_mtnop,
   1129	[MTRETEN]	 = tape_std_mtreten,
   1130	[MTBSFM]	 = tape_std_mtbsfm,
   1131	[MTFSFM]	 = tape_std_mtfsfm,
   1132	[MTEOM]		 = tape_std_mteom,
   1133	[MTERASE]	 = tape_std_mterase,
   1134	[MTRAS1]	 = NULL,
   1135	[MTRAS2]	 = NULL,
   1136	[MTRAS3]	 = NULL,
   1137	[MTSETBLK]	 = tape_std_mtsetblk,
   1138	[MTSETDENSITY]	 = NULL,
   1139	[MTSEEK]	 = tape_34xx_mtseek,
   1140	[MTTELL]	 = tape_34xx_mttell,
   1141	[MTSETDRVBUFFER] = NULL,
   1142	[MTFSS]		 = NULL,
   1143	[MTBSS]		 = NULL,
   1144	[MTWSM]		 = NULL,
   1145	[MTLOCK]	 = NULL,
   1146	[MTUNLOCK]	 = NULL,
   1147	[MTLOAD]	 = tape_std_mtload,
   1148	[MTUNLOAD]	 = tape_std_mtunload,
   1149	[MTCOMPRESSION]	 = tape_std_mtcompression,
   1150	[MTSETPART]	 = NULL,
   1151	[MTMKPART]	 = NULL
   1152};
   1153
   1154/*
   1155 * Tape discipline structure for 3480 and 3490.
   1156 */
   1157static struct tape_discipline tape_discipline_34xx = {
   1158	.owner = THIS_MODULE,
   1159	.setup_device = tape_34xx_setup_device,
   1160	.cleanup_device = tape_34xx_cleanup_device,
   1161	.process_eov = tape_std_process_eov,
   1162	.irq = tape_34xx_irq,
   1163	.read_block = tape_std_read_block,
   1164	.write_block = tape_std_write_block,
   1165	.ioctl_fn = tape_34xx_ioctl,
   1166	.mtop_array = tape_34xx_mtop
   1167};
   1168
   1169static struct ccw_device_id tape_34xx_ids[] = {
   1170	{ CCW_DEVICE_DEVTYPE(0x3480, 0, 0x3480, 0), .driver_info = tape_3480},
   1171	{ CCW_DEVICE_DEVTYPE(0x3490, 0, 0x3490, 0), .driver_info = tape_3490},
   1172	{ /* end of list */ },
   1173};
   1174
   1175static int
   1176tape_34xx_online(struct ccw_device *cdev)
   1177{
   1178	return tape_generic_online(
   1179		dev_get_drvdata(&cdev->dev),
   1180		&tape_discipline_34xx
   1181	);
   1182}
   1183
   1184static struct ccw_driver tape_34xx_driver = {
   1185	.driver = {
   1186		.name = "tape_34xx",
   1187		.owner = THIS_MODULE,
   1188	},
   1189	.ids = tape_34xx_ids,
   1190	.probe = tape_generic_probe,
   1191	.remove = tape_generic_remove,
   1192	.set_online = tape_34xx_online,
   1193	.set_offline = tape_generic_offline,
   1194	.int_class = IRQIO_TAP,
   1195};
   1196
   1197static int
   1198tape_34xx_init (void)
   1199{
   1200	int rc;
   1201
   1202	TAPE_DBF_AREA = debug_register ( "tape_34xx", 2, 2, 4*sizeof(long));
   1203	debug_register_view(TAPE_DBF_AREA, &debug_sprintf_view);
   1204#ifdef DBF_LIKE_HELL
   1205	debug_set_level(TAPE_DBF_AREA, 6);
   1206#endif
   1207
   1208	DBF_EVENT(3, "34xx init\n");
   1209	/* Register driver for 3480/3490 tapes. */
   1210	rc = ccw_driver_register(&tape_34xx_driver);
   1211	if (rc)
   1212		DBF_EVENT(3, "34xx init failed\n");
   1213	else
   1214		DBF_EVENT(3, "34xx registered\n");
   1215	return rc;
   1216}
   1217
   1218static void
   1219tape_34xx_exit(void)
   1220{
   1221	ccw_driver_unregister(&tape_34xx_driver);
   1222
   1223	debug_unregister(TAPE_DBF_AREA);
   1224}
   1225
   1226MODULE_DEVICE_TABLE(ccw, tape_34xx_ids);
   1227MODULE_AUTHOR("(C) 2001-2002 IBM Deutschland Entwicklung GmbH");
   1228MODULE_DESCRIPTION("Linux on zSeries channel attached 3480 tape device driver");
   1229MODULE_LICENSE("GPL");
   1230
   1231module_init(tape_34xx_init);
   1232module_exit(tape_34xx_exit);