ide-disk: set_addressing() fixes
[deliverable/linux.git] / drivers / ide / ide-disk.c
CommitLineData
1da177e4 1/*
59bca8cc
BZ
2 * Copyright (C) 1994-1998 Linus Torvalds & authors (see below)
3 * Copyright (C) 1998-2002 Linux ATA Development
4 * Andre Hedrick <andre@linux-ide.org>
5 * Copyright (C) 2003 Red Hat <alan@redhat.com>
6 * Copyright (C) 2003-2005, 2007 Bartlomiej Zolnierkiewicz
1da177e4
LT
7 */
8
9/*
10 * Mostly written by Mark Lord <mlord@pobox.com>
11 * and Gadi Oxman <gadio@netvision.net.il>
12 * and Andre Hedrick <andre@linux-ide.org>
13 *
14 * This is the IDE/ATA disk driver, as evolved from hd.c and ide.c.
1da177e4
LT
15 */
16
17#define IDEDISK_VERSION "1.18"
18
1da177e4
LT
19#include <linux/module.h>
20#include <linux/types.h>
21#include <linux/string.h>
22#include <linux/kernel.h>
23#include <linux/timer.h>
24#include <linux/mm.h>
25#include <linux/interrupt.h>
26#include <linux/major.h>
27#include <linux/errno.h>
28#include <linux/genhd.h>
29#include <linux/slab.h>
30#include <linux/delay.h>
cf8b8975 31#include <linux/mutex.h>
2bfb646c 32#include <linux/leds.h>
1da177e4 33#include <linux/ide.h>
3ceca727 34#include <linux/hdreg.h>
1da177e4
LT
35
36#include <asm/byteorder.h>
37#include <asm/irq.h>
38#include <asm/uaccess.h>
39#include <asm/io.h>
40#include <asm/div64.h>
41
870d6656 42#if !defined(CONFIG_DEBUG_BLOCK_EXT_DEVT)
689d6fac 43#define IDE_DISK_MINORS (1 << PARTN_BITS)
870d6656 44#else
3e1a7ff8 45#define IDE_DISK_MINORS 0
870d6656
TH
46#endif
47
1da177e4
LT
48struct ide_disk_obj {
49 ide_drive_t *drive;
50 ide_driver_t *driver;
51 struct gendisk *disk;
52 struct kref kref;
c94964a4 53 unsigned int openers; /* protected by BKL for now */
1da177e4
LT
54};
55
cf8b8975 56static DEFINE_MUTEX(idedisk_ref_mutex);
1da177e4
LT
57
58#define to_ide_disk(obj) container_of(obj, struct ide_disk_obj, kref)
59
60#define ide_disk_g(disk) \
61 container_of((disk)->private_data, struct ide_disk_obj, driver)
62
08da591e
BZ
63static void ide_disk_release(struct kref *);
64
1da177e4
LT
65static struct ide_disk_obj *ide_disk_get(struct gendisk *disk)
66{
67 struct ide_disk_obj *idkp = NULL;
68
cf8b8975 69 mutex_lock(&idedisk_ref_mutex);
1da177e4 70 idkp = ide_disk_g(disk);
08da591e 71 if (idkp) {
d3e33ff5 72 if (ide_device_get(idkp->drive))
08da591e 73 idkp = NULL;
d3e33ff5
BZ
74 else
75 kref_get(&idkp->kref);
08da591e 76 }
cf8b8975 77 mutex_unlock(&idedisk_ref_mutex);
1da177e4
LT
78 return idkp;
79}
80
1da177e4
LT
81static void ide_disk_put(struct ide_disk_obj *idkp)
82{
d3e33ff5
BZ
83 ide_drive_t *drive = idkp->drive;
84
cf8b8975 85 mutex_lock(&idedisk_ref_mutex);
1da177e4 86 kref_put(&idkp->kref, ide_disk_release);
d3e33ff5 87 ide_device_put(drive);
cf8b8975 88 mutex_unlock(&idedisk_ref_mutex);
1da177e4
LT
89}
90
ba76ae38 91static const u8 ide_rw_cmds[] = {
aaaade3f
BZ
92 ATA_CMD_READ_MULTI,
93 ATA_CMD_WRITE_MULTI,
94 ATA_CMD_READ_MULTI_EXT,
95 ATA_CMD_WRITE_MULTI_EXT,
96 ATA_CMD_PIO_READ,
97 ATA_CMD_PIO_WRITE,
98 ATA_CMD_PIO_READ_EXT,
99 ATA_CMD_PIO_WRITE_EXT,
100 ATA_CMD_READ,
101 ATA_CMD_WRITE,
102 ATA_CMD_READ_EXT,
103 ATA_CMD_WRITE_EXT,
ba76ae38
BZ
104};
105
106static const u8 ide_data_phases[] = {
107 TASKFILE_MULTI_IN,
108 TASKFILE_MULTI_OUT,
109 TASKFILE_IN,
110 TASKFILE_OUT,
111 TASKFILE_IN_DMA,
112 TASKFILE_OUT_DMA,
113};
114
115static void ide_tf_set_cmd(ide_drive_t *drive, ide_task_t *task, u8 dma)
116{
117 u8 index, lba48, write;
118
119 lba48 = (task->tf_flags & IDE_TFLAG_LBA48) ? 2 : 0;
120 write = (task->tf_flags & IDE_TFLAG_WRITE) ? 1 : 0;
121
122 if (dma)
ba4b2e60 123 index = 8;
ba76ae38
BZ
124 else
125 index = drive->mult_count ? 0 : 4;
126
127 task->tf.command = ide_rw_cmds[index + lba48 + write];
128
129 if (dma)
130 index = 8; /* fixup index */
131
132 task->data_phase = ide_data_phases[index / 2 + write];
133}
134
1da177e4
LT
135/*
136 * __ide_do_rw_disk() issues READ and WRITE commands to a disk,
137 * using LBA if supported, or CHS otherwise, to address sectors.
138 */
98416549
BZ
139static ide_startstop_t __ide_do_rw_disk(ide_drive_t *drive, struct request *rq,
140 sector_t block)
1da177e4
LT
141{
142 ide_hwif_t *hwif = HWIF(drive);
143 unsigned int dma = drive->using_dma;
790d1239 144 u16 nsectors = (u16)rq->nr_sectors;
1da177e4 145 u8 lba48 = (drive->addressing == 1) ? 1 : 0;
9e42237f
BZ
146 ide_task_t task;
147 struct ide_taskfile *tf = &task.tf;
f6e29e35 148 ide_startstop_t rc;
1da177e4 149
238e4f14 150 if ((hwif->host_flags & IDE_HFLAG_NO_LBA48_DMA) && lba48 && dma) {
1da177e4
LT
151 if (block + rq->nr_sectors > 1ULL << 28)
152 dma = 0;
153 else
154 lba48 = 0;
155 }
156
157 if (!dma) {
158 ide_init_sg_cmd(drive, rq);
159 ide_map_sg(drive, rq);
160 }
161
9e42237f 162 memset(&task, 0, sizeof(task));
9a410e79 163 task.tf_flags = IDE_TFLAG_TF | IDE_TFLAG_DEVICE;
2bd06b23 164
1da177e4
LT
165 if (drive->select.b.lba) {
166 if (lba48) {
c2f8311d
MR
167 pr_debug("%s: LBA=0x%012llx\n", drive->name,
168 (unsigned long long)block);
1da177e4 169
790d1239 170 tf->hob_nsect = (nsectors >> 8) & 0xff;
2bd06b23
BZ
171 tf->hob_lbal = (u8)(block >> 24);
172 if (sizeof(block) != 4) {
173 tf->hob_lbam = (u8)((u64)block >> 32);
174 tf->hob_lbah = (u8)((u64)block >> 40);
1da177e4 175 }
2bd06b23 176
790d1239 177 tf->nsect = nsectors & 0xff;
2bd06b23
BZ
178 tf->lbal = (u8) block;
179 tf->lbam = (u8)(block >> 8);
180 tf->lbah = (u8)(block >> 16);
6dd9b837 181
657cc1a8 182 task.tf_flags |= (IDE_TFLAG_LBA48 | IDE_TFLAG_HOB);
1da177e4 183 } else {
790d1239 184 tf->nsect = nsectors & 0xff;
2bd06b23
BZ
185 tf->lbal = block;
186 tf->lbam = block >>= 8;
187 tf->lbah = block >>= 8;
188 tf->device = (block >> 8) & 0xf;
1da177e4
LT
189 }
190 } else {
98416549
BZ
191 unsigned int sect, head, cyl, track;
192
1da177e4
LT
193 track = (int)block / drive->sect;
194 sect = (int)block % drive->sect + 1;
1da177e4
LT
195 head = track % drive->head;
196 cyl = track / drive->head;
197
198 pr_debug("%s: CHS=%u/%u/%u\n", drive->name, cyl, head, sect);
199
790d1239 200 tf->nsect = nsectors & 0xff;
2bd06b23
BZ
201 tf->lbal = sect;
202 tf->lbam = cyl;
203 tf->lbah = cyl >> 8;
204 tf->device = head;
1da177e4
LT
205 }
206
ba76ae38
BZ
207 if (rq_data_dir(rq))
208 task.tf_flags |= IDE_TFLAG_WRITE;
209
210 ide_tf_set_cmd(drive, &task, dma);
f6e29e35
BZ
211 if (!dma)
212 hwif->data_phase = task.data_phase;
213 task.rq = rq;
ba76ae38 214
f6e29e35 215 rc = do_rw_taskfile(drive, &task);
2bd06b23 216
f6e29e35 217 if (rc == ide_stopped && dma) {
1da177e4 218 /* fallback to PIO */
f6e29e35 219 task.tf_flags |= IDE_TFLAG_DMA_PIO_FALLBACK;
ba76ae38 220 ide_tf_set_cmd(drive, &task, 0);
f6e29e35 221 hwif->data_phase = task.data_phase;
1da177e4 222 ide_init_sg_cmd(drive, rq);
f6e29e35 223 rc = do_rw_taskfile(drive, &task);
1da177e4
LT
224 }
225
f6e29e35 226 return rc;
1da177e4
LT
227}
228
229/*
230 * 268435455 == 137439 MB or 28bit limit
231 * 320173056 == 163929 MB or 48bit addressing
232 * 1073741822 == 549756 MB or 48bit addressing fake drive
233 */
234
98416549
BZ
235static ide_startstop_t ide_do_rw_disk(ide_drive_t *drive, struct request *rq,
236 sector_t block)
1da177e4
LT
237{
238 ide_hwif_t *hwif = HWIF(drive);
239
240 BUG_ON(drive->blocked);
241
242 if (!blk_fs_request(rq)) {
243 blk_dump_rq_flags(rq, "ide_do_rw_disk - bad command");
244 ide_end_request(drive, 0, 0);
245 return ide_stopped;
246 }
247
2bfb646c
RP
248 ledtrig_ide_activity();
249
1da177e4
LT
250 pr_debug("%s: %sing: block=%llu, sectors=%lu, buffer=0x%08lx\n",
251 drive->name, rq_data_dir(rq) == READ ? "read" : "writ",
c2f8311d
MR
252 (unsigned long long)block, rq->nr_sectors,
253 (unsigned long)rq->buffer);
1da177e4
LT
254
255 if (hwif->rw_disk)
256 hwif->rw_disk(drive, rq);
257
258 return __ide_do_rw_disk(drive, rq, block);
259}
260
261/*
262 * Queries for true maximum capacity of the drive.
263 * Returns maximum LBA address (> 0) of the drive, 0 if failed.
264 */
7a3b7512 265static u64 idedisk_read_native_max_address(ide_drive_t *drive, int lba48)
1da177e4
LT
266{
267 ide_task_t args;
650d841d 268 struct ide_taskfile *tf = &args.tf;
7a3b7512 269 u64 addr = 0;
1da177e4
LT
270
271 /* Create IDE/ATA command request structure */
272 memset(&args, 0, sizeof(ide_task_t));
7a3b7512 273 if (lba48)
aaaade3f 274 tf->command = ATA_CMD_READ_NATIVE_MAX_EXT;
7a3b7512 275 else
aaaade3f 276 tf->command = ATA_CMD_READ_NATIVE_MAX;
650d841d 277 tf->device = ATA_LBA;
657cc1a8 278 args.tf_flags = IDE_TFLAG_TF | IDE_TFLAG_DEVICE;
a3bbb9d8 279 if (lba48)
657cc1a8 280 args.tf_flags |= (IDE_TFLAG_LBA48 | IDE_TFLAG_HOB);
1da177e4 281 /* submit command request */
9a3c49be 282 ide_no_data_taskfile(drive, &args);
1da177e4 283
1da177e4 284 /* if OK, compute maximum address value */
a501633c
BZ
285 if ((tf->status & 0x01) == 0)
286 addr = ide_get_lba_addr(tf, lba48) + 1;
650d841d 287
1da177e4
LT
288 return addr;
289}
290
291/*
292 * Sets maximum virtual LBA address of the drive.
293 * Returns new maximum virtual LBA address (> 0) or 0 on failure.
294 */
7a3b7512 295static u64 idedisk_set_max_address(ide_drive_t *drive, u64 addr_req, int lba48)
1da177e4
LT
296{
297 ide_task_t args;
650d841d 298 struct ide_taskfile *tf = &args.tf;
7a3b7512 299 u64 addr_set = 0;
1da177e4
LT
300
301 addr_req--;
302 /* Create IDE/ATA command request structure */
303 memset(&args, 0, sizeof(ide_task_t));
650d841d
BZ
304 tf->lbal = (addr_req >> 0) & 0xff;
305 tf->lbam = (addr_req >>= 8) & 0xff;
306 tf->lbah = (addr_req >>= 8) & 0xff;
7a3b7512
BZ
307 if (lba48) {
308 tf->hob_lbal = (addr_req >>= 8) & 0xff;
309 tf->hob_lbam = (addr_req >>= 8) & 0xff;
310 tf->hob_lbah = (addr_req >>= 8) & 0xff;
aaaade3f 311 tf->command = ATA_CMD_SET_MAX_EXT;
7a3b7512
BZ
312 } else {
313 tf->device = (addr_req >>= 8) & 0x0f;
aaaade3f 314 tf->command = ATA_CMD_SET_MAX;
7a3b7512
BZ
315 }
316 tf->device |= ATA_LBA;
657cc1a8 317 args.tf_flags = IDE_TFLAG_TF | IDE_TFLAG_DEVICE;
a3bbb9d8 318 if (lba48)
657cc1a8 319 args.tf_flags |= (IDE_TFLAG_LBA48 | IDE_TFLAG_HOB);
1da177e4 320 /* submit command request */
9a3c49be 321 ide_no_data_taskfile(drive, &args);
1da177e4 322 /* if OK, compute maximum address value */
a501633c
BZ
323 if ((tf->status & 0x01) == 0)
324 addr_set = ide_get_lba_addr(tf, lba48) + 1;
650d841d 325
1da177e4
LT
326 return addr_set;
327}
328
329static unsigned long long sectors_to_MB(unsigned long long n)
330{
331 n <<= 9; /* make it bytes */
332 do_div(n, 1000000); /* make it MB */
333 return n;
334}
335
b0244a00
BZ
336/*
337 * Some disks report total number of sectors instead of
338 * maximum sector address. We list them here.
339 */
340static const struct drive_list_entry hpa_list[] = {
341 { "ST340823A", NULL },
7062cdc5 342 { "ST320413A", NULL },
b152fcd3 343 { "ST310211A", NULL },
b0244a00
BZ
344 { NULL, NULL }
345};
346
858119e1 347static void idedisk_check_hpa(ide_drive_t *drive)
1da177e4
LT
348{
349 unsigned long long capacity, set_max;
942dcd85 350 int lba48 = ata_id_lba48_enabled(drive->id);
1da177e4
LT
351
352 capacity = drive->capacity64;
7a3b7512
BZ
353
354 set_max = idedisk_read_native_max_address(drive, lba48);
1da177e4 355
b0244a00
BZ
356 if (ide_in_drive_list(drive->id, hpa_list)) {
357 /*
358 * Since we are inclusive wrt to firmware revisions do this
359 * extra check and apply the workaround only when needed.
360 */
361 if (set_max == capacity + 1)
362 set_max--;
363 }
364
1da177e4
LT
365 if (set_max <= capacity)
366 return;
367
368 printk(KERN_INFO "%s: Host Protected Area detected.\n"
369 "\tcurrent capacity is %llu sectors (%llu MB)\n"
370 "\tnative capacity is %llu sectors (%llu MB)\n",
371 drive->name,
372 capacity, sectors_to_MB(capacity),
373 set_max, sectors_to_MB(set_max));
374
7a3b7512
BZ
375 set_max = idedisk_set_max_address(drive, set_max, lba48);
376
1da177e4
LT
377 if (set_max) {
378 drive->capacity64 = set_max;
379 printk(KERN_INFO "%s: Host Protected Area disabled.\n",
380 drive->name);
381 }
382}
383
98416549 384static void init_idedisk_capacity(ide_drive_t *drive)
1da177e4 385{
4dde4492 386 u16 *id = drive->id;
1da177e4
LT
387 /*
388 * If this drive supports the Host Protected Area feature set,
389 * then we may need to change our opinion about the drive's capacity.
390 */
f41891c1 391 int hpa = ata_id_hpa_enabled(id);
1da177e4 392
942dcd85 393 if (ata_id_lba48_enabled(id)) {
1da177e4
LT
394 /* drive speaks 48-bit LBA */
395 drive->select.b.lba = 1;
48fb2688 396 drive->capacity64 = ata_id_u64(id, ATA_ID_LBA_CAPACITY_2);
1da177e4
LT
397 if (hpa)
398 idedisk_check_hpa(drive);
a02227c9 399 } else if (ata_id_has_lba(id) && ata_id_is_lba_capacity_ok(id)) {
1da177e4
LT
400 /* drive speaks 28-bit LBA */
401 drive->select.b.lba = 1;
48fb2688 402 drive->capacity64 = ata_id_u32(id, ATA_ID_LBA_CAPACITY);
1da177e4
LT
403 if (hpa)
404 idedisk_check_hpa(drive);
405 } else {
406 /* drive speaks boring old 28-bit CHS */
407 drive->capacity64 = drive->cyl * drive->head * drive->sect;
408 }
409}
410
98416549 411static sector_t idedisk_capacity(ide_drive_t *drive)
1da177e4 412{
3c619ffd 413 return drive->capacity64;
1da177e4
LT
414}
415
ecfd80e4 416#ifdef CONFIG_IDE_PROC_FS
1da177e4
LT
417static int smart_enable(ide_drive_t *drive)
418{
419 ide_task_t args;
650d841d 420 struct ide_taskfile *tf = &args.tf;
1da177e4
LT
421
422 memset(&args, 0, sizeof(ide_task_t));
aaaade3f
BZ
423 tf->feature = ATA_SMART_ENABLE;
424 tf->lbam = ATA_SMART_LBAM_PASS;
425 tf->lbah = ATA_SMART_LBAH_PASS;
426 tf->command = ATA_CMD_SMART;
657cc1a8 427 args.tf_flags = IDE_TFLAG_TF | IDE_TFLAG_DEVICE;
9a3c49be 428 return ide_no_data_taskfile(drive, &args);
1da177e4
LT
429}
430
43e7c0c4 431static int get_smart_data(ide_drive_t *drive, u8 *buf, u8 sub_cmd)
1da177e4
LT
432{
433 ide_task_t args;
650d841d 434 struct ide_taskfile *tf = &args.tf;
1da177e4
LT
435
436 memset(&args, 0, sizeof(ide_task_t));
650d841d
BZ
437 tf->feature = sub_cmd;
438 tf->nsect = 0x01;
aaaade3f
BZ
439 tf->lbam = ATA_SMART_LBAM_PASS;
440 tf->lbah = ATA_SMART_LBAH_PASS;
441 tf->command = ATA_CMD_SMART;
657cc1a8 442 args.tf_flags = IDE_TFLAG_TF | IDE_TFLAG_DEVICE;
ac026ff2 443 args.data_phase = TASKFILE_IN;
1da177e4 444 (void) smart_enable(drive);
ac026ff2 445 return ide_raw_taskfile(drive, &args, buf, 1);
1da177e4
LT
446}
447
448static int proc_idedisk_read_cache
449 (char *page, char **start, off_t off, int count, int *eof, void *data)
450{
451 ide_drive_t *drive = (ide_drive_t *) data;
452 char *out = page;
453 int len;
454
455 if (drive->id_read)
4dde4492 456 len = sprintf(out, "%i\n", drive->id[ATA_ID_BUF_SIZE] / 2);
1da177e4 457 else
98416549
BZ
458 len = sprintf(out, "(none)\n");
459
460 PROC_IDE_READ_RETURN(page, start, off, count, eof, len);
1da177e4
LT
461}
462
463static int proc_idedisk_read_capacity
464 (char *page, char **start, off_t off, int count, int *eof, void *data)
465{
466 ide_drive_t*drive = (ide_drive_t *)data;
467 int len;
468
98416549
BZ
469 len = sprintf(page, "%llu\n", (long long)idedisk_capacity(drive));
470
471 PROC_IDE_READ_RETURN(page, start, off, count, eof, len);
1da177e4
LT
472}
473
799ee57a
BZ
474static int proc_idedisk_read_smart(char *page, char **start, off_t off,
475 int count, int *eof, void *data, u8 sub_cmd)
1da177e4
LT
476{
477 ide_drive_t *drive = (ide_drive_t *)data;
478 int len = 0, i = 0;
479
799ee57a 480 if (get_smart_data(drive, page, sub_cmd) == 0) {
1da177e4 481 unsigned short *val = (unsigned short *) page;
151a6701
BZ
482 char *out = (char *)val + SECTOR_SIZE;
483
1da177e4
LT
484 page = out;
485 do {
98416549
BZ
486 out += sprintf(out, "%04x%c", le16_to_cpu(*val),
487 (++i & 7) ? ' ' : '\n');
1da177e4 488 val += 1;
151a6701 489 } while (i < SECTOR_SIZE / 2);
1da177e4
LT
490 len = out - page;
491 }
98416549
BZ
492
493 PROC_IDE_READ_RETURN(page, start, off, count, eof, len);
1da177e4
LT
494}
495
799ee57a 496static int proc_idedisk_read_sv
1da177e4
LT
497 (char *page, char **start, off_t off, int count, int *eof, void *data)
498{
799ee57a 499 return proc_idedisk_read_smart(page, start, off, count, eof, data,
aaaade3f 500 ATA_SMART_READ_VALUES);
799ee57a 501}
1da177e4 502
799ee57a
BZ
503static int proc_idedisk_read_st
504 (char *page, char **start, off_t off, int count, int *eof, void *data)
505{
506 return proc_idedisk_read_smart(page, start, off, count, eof, data,
aaaade3f 507 ATA_SMART_READ_THRESHOLDS);
1da177e4
LT
508}
509
510static ide_proc_entry_t idedisk_proc[] = {
799ee57a
BZ
511 { "cache", S_IFREG|S_IRUGO, proc_idedisk_read_cache, NULL },
512 { "capacity", S_IFREG|S_IRUGO, proc_idedisk_read_capacity, NULL },
513 { "geometry", S_IFREG|S_IRUGO, proc_ide_read_geometry, NULL },
514 { "smart_values", S_IFREG|S_IRUSR, proc_idedisk_read_sv, NULL },
515 { "smart_thresholds", S_IFREG|S_IRUSR, proc_idedisk_read_st, NULL },
1da177e4
LT
516 { NULL, 0, NULL, NULL }
517};
ecfd80e4 518#endif /* CONFIG_IDE_PROC_FS */
1da177e4 519
165125e1 520static void idedisk_prepare_flush(struct request_queue *q, struct request *rq)
1da177e4
LT
521{
522 ide_drive_t *drive = q->queuedata;
395d8ef5 523 ide_task_t *task = kmalloc(sizeof(*task), GFP_ATOMIC);
1da177e4 524
395d8ef5
BZ
525 /* FIXME: map struct ide_taskfile on rq->cmd[] */
526 BUG_ON(task == NULL);
527
528 memset(task, 0, sizeof(*task));
ff2779b5 529 if (ata_id_flush_ext_enabled(drive->id) &&
1da177e4 530 (drive->capacity64 >= (1UL << 28)))
aaaade3f 531 task->tf.command = ATA_CMD_FLUSH_EXT;
1da177e4 532 else
aaaade3f 533 task->tf.command = ATA_CMD_FLUSH;
395d8ef5
BZ
534 task->tf_flags = IDE_TFLAG_OUT_TF | IDE_TFLAG_OUT_DEVICE |
535 IDE_TFLAG_DYN;
536 task->data_phase = TASKFILE_NO_DATA;
1da177e4 537
813a0eb2 538 rq->cmd_type = REQ_TYPE_ATA_TASKFILE;
4aff5e23 539 rq->cmd_flags |= REQ_SOFTBARRIER;
395d8ef5 540 rq->special = task;
1da177e4
LT
541}
542
8185d5aa
BZ
543ide_devset_get(multcount, mult_count);
544
1da177e4
LT
545/*
546 * This is tightly woven into the driver->do_special can not touch.
547 * DON'T do it again until a total personality rewrite is committed.
548 */
549static int set_multcount(ide_drive_t *drive, int arg)
550{
dd47087b
FT
551 struct request *rq;
552 int error;
1da177e4 553
48fb2688 554 if (arg < 0 || arg > (drive->id[ATA_ID_MAX_MULTSECT] & 0xff))
1497943e
BZ
555 return -EINVAL;
556
1da177e4
LT
557 if (drive->special.b.set_multmode)
558 return -EBUSY;
852738f3 559
dd47087b
FT
560 rq = blk_get_request(drive->queue, READ, __GFP_WAIT);
561 rq->cmd_type = REQ_TYPE_ATA_TASKFILE;
852738f3 562
1da177e4
LT
563 drive->mult_req = arg;
564 drive->special.b.set_multmode = 1;
dd47087b
FT
565 error = blk_execute_rq(drive->queue, NULL, rq, 0);
566 blk_put_request(rq);
98416549 567
1da177e4
LT
568 return (drive->mult_count == arg) ? 0 : -EIO;
569}
570
8185d5aa
BZ
571ide_devset_get(nowerr, nowerr);
572
1da177e4
LT
573static int set_nowerr(ide_drive_t *drive, int arg)
574{
1497943e
BZ
575 if (arg < 0 || arg > 1)
576 return -EINVAL;
577
1da177e4
LT
578 drive->nowerr = arg;
579 drive->bad_wstat = arg ? BAD_R_STAT : BAD_W_STAT;
1da177e4
LT
580 return 0;
581}
582
3e087b57
TH
583static void update_ordered(ide_drive_t *drive)
584{
4dde4492 585 u16 *id = drive->id;
3e087b57
TH
586 unsigned ordered = QUEUE_ORDERED_NONE;
587 prepare_flush_fn *prep_fn = NULL;
3e087b57
TH
588
589 if (drive->wcache) {
590 unsigned long long capacity;
591 int barrier;
592 /*
593 * We must avoid issuing commands a drive does not
594 * understand or we may crash it. We check flush cache
595 * is supported. We also check we have the LBA48 flush
596 * cache if the drive capacity is too large. By this
597 * time we have trimmed the drive capacity if LBA48 is
598 * not available so we don't need to recheck that.
599 */
600 capacity = idedisk_capacity(drive);
4b58f17d 601 barrier = ata_id_flush_enabled(id) && !drive->noflush &&
3e087b57 602 (drive->addressing == 0 || capacity <= (1ULL << 28) ||
ff2779b5 603 ata_id_flush_ext_enabled(id));
3e087b57
TH
604
605 printk(KERN_INFO "%s: cache flushes %ssupported\n",
f7ad836c 606 drive->name, barrier ? "" : "not ");
3e087b57
TH
607
608 if (barrier) {
609 ordered = QUEUE_ORDERED_DRAIN_FLUSH;
610 prep_fn = idedisk_prepare_flush;
3e087b57
TH
611 }
612 } else
613 ordered = QUEUE_ORDERED_DRAIN;
614
615 blk_queue_ordered(drive->queue, ordered, prep_fn);
3e087b57
TH
616}
617
8185d5aa
BZ
618ide_devset_get(wcache, wcache);
619
620static int set_wcache(ide_drive_t *drive, int arg)
1da177e4
LT
621{
622 ide_task_t args;
3e087b57 623 int err = 1;
1da177e4 624
1497943e
BZ
625 if (arg < 0 || arg > 1)
626 return -EINVAL;
627
4b58f17d 628 if (ata_id_flush_enabled(drive->id)) {
3e087b57 629 memset(&args, 0, sizeof(ide_task_t));
650d841d 630 args.tf.feature = arg ?
aaaade3f
BZ
631 SETFEATURES_WC_ON : SETFEATURES_WC_OFF;
632 args.tf.command = ATA_CMD_SET_FEATURES;
657cc1a8 633 args.tf_flags = IDE_TFLAG_TF | IDE_TFLAG_DEVICE;
9a3c49be 634 err = ide_no_data_taskfile(drive, &args);
3e087b57
TH
635 if (err == 0)
636 drive->wcache = arg;
637 }
1da177e4 638
3e087b57 639 update_ordered(drive);
1da177e4 640
3e087b57 641 return err;
1da177e4
LT
642}
643
98416549 644static int do_idedisk_flushcache(ide_drive_t *drive)
1da177e4
LT
645{
646 ide_task_t args;
647
648 memset(&args, 0, sizeof(ide_task_t));
ff2779b5 649 if (ata_id_flush_ext_enabled(drive->id))
aaaade3f 650 args.tf.command = ATA_CMD_FLUSH_EXT;
1da177e4 651 else
aaaade3f 652 args.tf.command = ATA_CMD_FLUSH;
657cc1a8 653 args.tf_flags = IDE_TFLAG_TF | IDE_TFLAG_DEVICE;
9a3c49be 654 return ide_no_data_taskfile(drive, &args);
1da177e4
LT
655}
656
8185d5aa
BZ
657ide_devset_get(acoustic, acoustic);
658
98416549 659static int set_acoustic(ide_drive_t *drive, int arg)
1da177e4
LT
660{
661 ide_task_t args;
662
1497943e
BZ
663 if (arg < 0 || arg > 254)
664 return -EINVAL;
665
1da177e4 666 memset(&args, 0, sizeof(ide_task_t));
aaaade3f 667 args.tf.feature = arg ? SETFEATURES_AAM_ON : SETFEATURES_AAM_OFF;
650d841d 668 args.tf.nsect = arg;
aaaade3f 669 args.tf.command = ATA_CMD_SET_FEATURES;
657cc1a8 670 args.tf_flags = IDE_TFLAG_TF | IDE_TFLAG_DEVICE;
9a3c49be 671 ide_no_data_taskfile(drive, &args);
1da177e4
LT
672 drive->acoustic = arg;
673 return 0;
674}
675
aa768773 676ide_devset_get(addressing, addressing);
8185d5aa 677
1da177e4
LT
678/*
679 * drive->addressing:
680 * 0: 28-bit
681 * 1: 48-bit
682 * 2: 48-bit capable doing 28-bit
683 */
aa768773 684static int set_addressing(ide_drive_t *drive, int arg)
1da177e4 685{
1497943e
BZ
686 if (arg < 0 || arg > 2)
687 return -EINVAL;
688
35c13753
BZ
689 if (arg && ((drive->hwif->host_flags & IDE_HFLAG_NO_LBA48) ||
690 ata_id_lba48_enabled(drive->id) == 0))
98416549 691 return -EIO;
942dcd85 692
35c13753
BZ
693 if (arg == 2)
694 arg = 0;
695
1da177e4 696 drive->addressing = arg;
942dcd85 697
1da177e4
LT
698 return 0;
699}
700
92f1f8fd
EO
701ide_devset_rw(acoustic, acoustic);
702ide_devset_rw(address, addressing);
703ide_devset_rw(multcount, multcount);
704ide_devset_rw(wcache, wcache);
705
706ide_devset_rw_sync(nowerr, nowerr);
707
7662d046 708#ifdef CONFIG_IDE_PROC_FS
92f1f8fd
EO
709ide_devset_rw_field(bios_cyl, bios_cyl);
710ide_devset_rw_field(bios_head, bios_head);
711ide_devset_rw_field(bios_sect, bios_sect);
712ide_devset_rw_field(failures, failures);
713ide_devset_rw_field(lun, lun);
714ide_devset_rw_field(max_failures, max_failures);
715
716static const struct ide_proc_devset idedisk_settings[] = {
717 IDE_PROC_DEVSET(acoustic, 0, 254),
718 IDE_PROC_DEVSET(address, 0, 2),
719 IDE_PROC_DEVSET(bios_cyl, 0, 65535),
720 IDE_PROC_DEVSET(bios_head, 0, 255),
721 IDE_PROC_DEVSET(bios_sect, 0, 63),
722 IDE_PROC_DEVSET(failures, 0, 65535),
723 IDE_PROC_DEVSET(lun, 0, 7),
724 IDE_PROC_DEVSET(max_failures, 0, 65535),
725 IDE_PROC_DEVSET(multcount, 0, 16),
726 IDE_PROC_DEVSET(nowerr, 0, 1),
727 IDE_PROC_DEVSET(wcache, 0, 1),
728 { 0 },
8185d5aa 729};
7662d046 730#endif
1da177e4 731
98416549 732static void idedisk_setup(ide_drive_t *drive)
1da177e4 733{
1e874f44 734 struct ide_disk_obj *idkp = drive->driver_data;
238e4f14 735 ide_hwif_t *hwif = drive->hwif;
4dde4492
BZ
736 u16 *id = drive->id;
737 char *m = (char *)&id[ATA_ID_PROD];
1da177e4 738 unsigned long long capacity;
1da177e4 739
1e874f44 740 ide_proc_register_driver(drive, idkp->driver);
1da177e4
LT
741
742 if (drive->id_read == 0)
743 return;
744
98109337 745 if (drive->removable) {
1da177e4 746 /*
98416549 747 * Removable disks (eg. SYQUEST); ignore 'WD' drives
1da177e4 748 */
4dde4492 749 if (m[0] != 'W' || m[1] != 'D')
1da177e4 750 drive->doorlocking = 1;
1da177e4
LT
751 }
752
aa768773 753 (void)set_addressing(drive, 1);
1da177e4
LT
754
755 if (drive->addressing == 1) {
1da177e4
LT
756 int max_s = 2048;
757
758 if (max_s > hwif->rqsize)
759 max_s = hwif->rqsize;
760
761 blk_queue_max_sectors(drive->queue, max_s);
762 }
763
98416549
BZ
764 printk(KERN_INFO "%s: max request size: %dKiB\n", drive->name,
765 drive->queue->max_sectors / 2);
1da177e4
LT
766
767 /* calculate drive capacity, and select LBA if possible */
98416549 768 init_idedisk_capacity(drive);
1da177e4
LT
769
770 /* limit drive capacity to 137GB if LBA48 cannot be used */
771 if (drive->addressing == 0 && drive->capacity64 > 1ULL << 28) {
772 printk(KERN_WARNING "%s: cannot use LBA48 - full capacity "
773 "%llu sectors (%llu MB)\n",
774 drive->name, (unsigned long long)drive->capacity64,
775 sectors_to_MB(drive->capacity64));
776 drive->capacity64 = 1ULL << 28;
777 }
778
238e4f14 779 if ((hwif->host_flags & IDE_HFLAG_NO_LBA48_DMA) && drive->addressing) {
1da177e4 780 if (drive->capacity64 > 1ULL << 28) {
98416549
BZ
781 printk(KERN_INFO "%s: cannot use LBA48 DMA - PIO mode"
782 " will be used for accessing sectors "
783 "> %u\n", drive->name, 1 << 28);
1da177e4
LT
784 } else
785 drive->addressing = 0;
786 }
787
788 /*
789 * if possible, give fdisk access to more of the drive,
790 * by correcting bios_cyls:
791 */
98416549
BZ
792 capacity = idedisk_capacity(drive);
793
1da177e4 794 if (!drive->forced_geom) {
942dcd85 795 if (ata_id_lba48_enabled(drive->id)) {
1da177e4
LT
796 /* compatibility */
797 drive->bios_sect = 63;
798 drive->bios_head = 255;
799 }
800
801 if (drive->bios_sect && drive->bios_head) {
802 unsigned int cap0 = capacity; /* truncate to 32 bits */
803 unsigned int cylsz, cyl;
804
805 if (cap0 != capacity)
806 drive->bios_cyl = 65535;
807 else {
808 cylsz = drive->bios_sect * drive->bios_head;
809 cyl = cap0 / cylsz;
810 if (cyl > 65535)
811 cyl = 65535;
812 if (cyl > drive->bios_cyl)
813 drive->bios_cyl = cyl;
814 }
815 }
816 }
817 printk(KERN_INFO "%s: %llu sectors (%llu MB)",
818 drive->name, capacity, sectors_to_MB(capacity));
819
820 /* Only print cache size when it was specified */
4dde4492
BZ
821 if (id[ATA_ID_BUF_SIZE])
822 printk(KERN_CONT " w/%dKiB Cache", id[ATA_ID_BUF_SIZE] / 2);
1da177e4 823
3ab7efe8
BZ
824 printk(KERN_CONT ", CHS=%d/%d/%d\n",
825 drive->bios_cyl, drive->bios_head, drive->bios_sect);
1da177e4 826
1da177e4 827 /* write cache enabled? */
8a089c66 828 if ((id[ATA_ID_CSFO] & 1) || ata_id_wcache_enabled(id))
1da177e4
LT
829 drive->wcache = 1;
830
8185d5aa 831 set_wcache(drive, 1);
1da177e4
LT
832}
833
834static void ide_cacheflush_p(ide_drive_t *drive)
835{
4b58f17d 836 if (!drive->wcache || ata_id_flush_enabled(drive->id) == 0)
1da177e4
LT
837 return;
838
839 if (do_idedisk_flushcache(drive))
840 printk(KERN_INFO "%s: wcache flush failed!\n", drive->name);
841}
842
4031bbe4 843static void ide_disk_remove(ide_drive_t *drive)
1da177e4
LT
844{
845 struct ide_disk_obj *idkp = drive->driver_data;
846 struct gendisk *g = idkp->disk;
847
7662d046 848 ide_proc_unregister_driver(drive, idkp->driver);
8604affd 849
1da177e4
LT
850 del_gendisk(g);
851
d36fef6f
BZ
852 ide_cacheflush_p(drive);
853
1da177e4 854 ide_disk_put(idkp);
1da177e4
LT
855}
856
857static void ide_disk_release(struct kref *kref)
858{
859 struct ide_disk_obj *idkp = to_ide_disk(kref);
860 ide_drive_t *drive = idkp->drive;
861 struct gendisk *g = idkp->disk;
862
863 drive->driver_data = NULL;
1da177e4
LT
864 g->private_data = NULL;
865 put_disk(g);
866 kfree(idkp);
867}
868
4031bbe4 869static int ide_disk_probe(ide_drive_t *drive);
1da177e4 870
0d2157f7
LT
871/*
872 * On HPA drives the capacity needs to be
873 * reinitilized on resume otherwise the disk
874 * can not be used and a hard reset is required
875 */
876static void ide_disk_resume(ide_drive_t *drive)
877{
f41891c1 878 if (ata_id_hpa_enabled(drive->id))
0d2157f7
LT
879 init_idedisk_capacity(drive);
880}
881
4031bbe4 882static void ide_device_shutdown(ide_drive_t *drive)
1da177e4 883{
1da177e4
LT
884#ifdef CONFIG_ALPHA
885 /* On Alpha, halt(8) doesn't actually turn the machine off,
886 it puts you into the sort of firmware monitor. Typically,
887 it's used to boot another kernel image, so it's not much
888 different from reboot(8). Therefore, we don't need to
889 spin down the disk in this case, especially since Alpha
890 firmware doesn't handle disks in standby mode properly.
891 On the other hand, it's reasonably safe to turn the power
892 off when the shutdown process reaches the firmware prompt,
893 as the firmware initialization takes rather long time -
894 at least 10 seconds, which should be sufficient for
895 the disk to expire its write cache. */
896 if (system_state != SYSTEM_POWER_OFF) {
897#else
898 if (system_state == SYSTEM_RESTART) {
899#endif
900 ide_cacheflush_p(drive);
901 return;
902 }
903
d12faa27
BZ
904 printk(KERN_INFO "Shutdown: %s\n", drive->name);
905
4031bbe4 906 drive->gendev.bus->suspend(&drive->gendev, PMSG_SUSPEND);
1da177e4
LT
907}
908
1da177e4 909static ide_driver_t idedisk_driver = {
1da177e4 910 .gen_driver = {
4ef3b8f4 911 .owner = THIS_MODULE,
8604affd
BZ
912 .name = "ide-disk",
913 .bus = &ide_bus_type,
1da177e4 914 },
4031bbe4
RK
915 .probe = ide_disk_probe,
916 .remove = ide_disk_remove,
0d2157f7 917 .resume = ide_disk_resume,
4031bbe4 918 .shutdown = ide_device_shutdown,
1da177e4
LT
919 .version = IDEDISK_VERSION,
920 .media = ide_disk,
1da177e4
LT
921 .do_request = ide_do_rw_disk,
922 .end_request = ide_end_request,
923 .error = __ide_error,
7662d046 924#ifdef CONFIG_IDE_PROC_FS
1da177e4 925 .proc = idedisk_proc,
8185d5aa 926 .settings = idedisk_settings,
7662d046 927#endif
1da177e4
LT
928};
929
29ec683f
BZ
930static int idedisk_set_doorlock(ide_drive_t *drive, int on)
931{
932 ide_task_t task;
933
934 memset(&task, 0, sizeof(task));
aaaade3f 935 task.tf.command = on ? ATA_CMD_MEDIA_LOCK : ATA_CMD_MEDIA_UNLOCK;
657cc1a8 936 task.tf_flags = IDE_TFLAG_TF | IDE_TFLAG_DEVICE;
29ec683f
BZ
937
938 return ide_no_data_taskfile(drive, &task);
939}
940
1da177e4
LT
941static int idedisk_open(struct inode *inode, struct file *filp)
942{
943 struct gendisk *disk = inode->i_bdev->bd_disk;
944 struct ide_disk_obj *idkp;
945 ide_drive_t *drive;
946
98416549
BZ
947 idkp = ide_disk_get(disk);
948 if (idkp == NULL)
1da177e4
LT
949 return -ENXIO;
950
951 drive = idkp->drive;
952
c94964a4
BZ
953 idkp->openers++;
954
955 if (drive->removable && idkp->openers == 1) {
1da177e4
LT
956 check_disk_change(inode->i_bdev);
957 /*
958 * Ignore the return code from door_lock,
959 * since the open() has already succeeded,
960 * and the door_lock is irrelevant at this point.
961 */
29ec683f 962 if (drive->doorlocking && idedisk_set_doorlock(drive, 1))
1da177e4
LT
963 drive->doorlocking = 0;
964 }
965 return 0;
966}
967
968static int idedisk_release(struct inode *inode, struct file *filp)
969{
970 struct gendisk *disk = inode->i_bdev->bd_disk;
971 struct ide_disk_obj *idkp = ide_disk_g(disk);
972 ide_drive_t *drive = idkp->drive;
973
c94964a4 974 if (idkp->openers == 1)
1da177e4 975 ide_cacheflush_p(drive);
c94964a4
BZ
976
977 if (drive->removable && idkp->openers == 1) {
29ec683f 978 if (drive->doorlocking && idedisk_set_doorlock(drive, 0))
1da177e4
LT
979 drive->doorlocking = 0;
980 }
c94964a4
BZ
981
982 idkp->openers--;
1da177e4
LT
983
984 ide_disk_put(idkp);
985
986 return 0;
987}
988
a885c8c4
CH
989static int idedisk_getgeo(struct block_device *bdev, struct hd_geometry *geo)
990{
991 struct ide_disk_obj *idkp = ide_disk_g(bdev->bd_disk);
992 ide_drive_t *drive = idkp->drive;
993
994 geo->heads = drive->bios_head;
995 geo->sectors = drive->bios_sect;
996 geo->cylinders = (u16)drive->bios_cyl; /* truncate */
997 return 0;
998}
999
aa768773 1000static const struct ide_ioctl_devset ide_disk_ioctl_settings[] = {
92f1f8fd
EO
1001{ HDIO_GET_ADDRESS, HDIO_SET_ADDRESS, &ide_devset_address },
1002{ HDIO_GET_MULTCOUNT, HDIO_SET_MULTCOUNT, &ide_devset_multcount },
1003{ HDIO_GET_NOWERR, HDIO_SET_NOWERR, &ide_devset_nowerr },
1004{ HDIO_GET_WCACHE, HDIO_SET_WCACHE, &ide_devset_wcache },
1005{ HDIO_GET_ACOUSTIC, HDIO_SET_ACOUSTIC, &ide_devset_acoustic },
aa768773
BZ
1006{ 0 }
1007};
1008
1da177e4
LT
1009static int idedisk_ioctl(struct inode *inode, struct file *file,
1010 unsigned int cmd, unsigned long arg)
1011{
1012 struct block_device *bdev = inode->i_bdev;
1013 struct ide_disk_obj *idkp = ide_disk_g(bdev->bd_disk);
1497943e 1014 ide_drive_t *drive = idkp->drive;
aa768773 1015 int err;
1497943e 1016
aa768773
BZ
1017 err = ide_setting_ioctl(drive, bdev, cmd, arg, ide_disk_ioctl_settings);
1018 if (err != -EOPNOTSUPP)
1019 return err;
1497943e 1020
aa768773 1021 return generic_ide_ioctl(drive, file, bdev, cmd, arg);
1da177e4
LT
1022}
1023
1024static int idedisk_media_changed(struct gendisk *disk)
1025{
1026 struct ide_disk_obj *idkp = ide_disk_g(disk);
1027 ide_drive_t *drive = idkp->drive;
1028
1029 /* do not scan partitions twice if this is a removable device */
1030 if (drive->attach) {
1031 drive->attach = 0;
1032 return 0;
1033 }
1034 /* if removable, always assume it was changed */
1035 return drive->removable;
1036}
1037
1038static int idedisk_revalidate_disk(struct gendisk *disk)
1039{
1040 struct ide_disk_obj *idkp = ide_disk_g(disk);
1041 set_capacity(disk, idedisk_capacity(idkp->drive));
1042 return 0;
1043}
1044
1045static struct block_device_operations idedisk_ops = {
98416549
BZ
1046 .owner = THIS_MODULE,
1047 .open = idedisk_open,
1048 .release = idedisk_release,
1049 .ioctl = idedisk_ioctl,
1050 .getgeo = idedisk_getgeo,
1051 .media_changed = idedisk_media_changed,
1052 .revalidate_disk = idedisk_revalidate_disk
1da177e4
LT
1053};
1054
1055MODULE_DESCRIPTION("ATA DISK Driver");
1056
4031bbe4 1057static int ide_disk_probe(ide_drive_t *drive)
1da177e4
LT
1058{
1059 struct ide_disk_obj *idkp;
1060 struct gendisk *g;
1061
1062 /* strstr("foo", "") is non-NULL */
1063 if (!strstr("ide-disk", drive->driver_req))
1064 goto failed;
2a924662 1065
1da177e4
LT
1066 if (drive->media != ide_disk)
1067 goto failed;
1068
f5e3c2fa 1069 idkp = kzalloc(sizeof(*idkp), GFP_KERNEL);
1da177e4
LT
1070 if (!idkp)
1071 goto failed;
1072
689d6fac 1073 g = alloc_disk_node(IDE_DISK_MINORS, hwif_to_node(drive->hwif));
1da177e4
LT
1074 if (!g)
1075 goto out_free_idkp;
1076
1077 ide_init_disk(g, drive);
1078
1da177e4
LT
1079 kref_init(&idkp->kref);
1080
1081 idkp->drive = drive;
1082 idkp->driver = &idedisk_driver;
1083 idkp->disk = g;
1084
1085 g->private_data = &idkp->driver;
1086
1087 drive->driver_data = idkp;
1088
1da177e4
LT
1089 idedisk_setup(drive);
1090 if ((!drive->head || drive->head > 16) && !drive->select.b.lba) {
1091 printk(KERN_ERR "%s: INVALID GEOMETRY: %d PHYSICAL HEADS?\n",
1092 drive->name, drive->head);
1093 drive->attach = 0;
1094 } else
1095 drive->attach = 1;
8604affd 1096
f615b48c 1097 g->minors = IDE_DISK_MINORS;
1da177e4 1098 g->driverfs_dev = &drive->gendev;
689d6fac
TH
1099 g->flags |= GENHD_FL_EXT_DEVT;
1100 if (drive->removable)
1101 g->flags |= GENHD_FL_REMOVABLE;
1da177e4
LT
1102 set_capacity(g, idedisk_capacity(drive));
1103 g->fops = &idedisk_ops;
1104 add_disk(g);
1105 return 0;
1106
1da177e4
LT
1107out_free_idkp:
1108 kfree(idkp);
1109failed:
8604affd 1110 return -ENODEV;
1da177e4
LT
1111}
1112
98416549 1113static void __exit idedisk_exit(void)
1da177e4 1114{
8604affd 1115 driver_unregister(&idedisk_driver.gen_driver);
1da177e4
LT
1116}
1117
17514e8a 1118static int __init idedisk_init(void)
1da177e4 1119{
8604affd 1120 return driver_register(&idedisk_driver.gen_driver);
1da177e4
LT
1121}
1122
263756ec 1123MODULE_ALIAS("ide:*m-disk*");
1da177e4
LT
1124module_init(idedisk_init);
1125module_exit(idedisk_exit);
1126MODULE_LICENSE("GPL");
This page took 0.644942 seconds and 5 git commands to generate.