예제 #1
0
static int ps3disk_strategy(void *devdata, int flag, daddr_t dblk,
	size_t size, char *buf, size_t *rsize)
{
	struct ps3_devdesc *dev = (struct ps3_devdesc *) devdata;
	struct open_dev *od = (struct open_dev *) dev->d_disk.data;
	int err;

	if (flag != F_READ) {
		dev_printf(dev, "write operation is not supported!\n");
		return EROFS;
	}

	if (size % stor_dev.sd_blksize) {
		dev_printf(dev, "size=%u is not multiple of device block size=%llu\n",
			size, stor_dev.sd_blksize);
		return EIO;
	}

	if (rsize)
		*rsize = 0;

	err = ps3stor_read_sectors(&stor_dev, dev->d_unit, od->od_start + dblk,
		size / stor_dev.sd_blksize,  0, buf);

	if (!err && rsize)
		*rsize = size;

	if (err)
		dev_printf(dev, "read operation failed dblk=%llu size=%d err=%d\n",
			dblk, size, err);

	return err;
}
예제 #2
0
static int ps3disk_open(struct open_file *f, ...)
{
	va_list ap;
	struct ps3_devdesc *dev;
	struct open_dev *od;
	int err;

	va_start(ap, f);
	dev = va_arg(ap, struct ps3_devdesc *);
	va_end(ap);

	od = malloc(sizeof(struct open_dev));
	if (!od) {
		dev_printf(dev, "couldn't allocate memory for new open_dev\n");
		return ENOMEM;
	}

	err = ps3disk_open_gpt(dev, od);

	if (err) {
		dev_printf(dev, "couldn't open GPT disk error=%d\n", err);
		free(od);
	} else {
		((struct ps3_devdesc *) (f->f_devdata))->d_disk.data = od;
	}

	return err;
}
예제 #3
0
static int ps3cdrom_open(struct open_file *f, ...)
{
	char buf[2048];
	va_list ap;
	struct ps3_devdesc *dev;
	int err;

	va_start(ap, f);
	dev = va_arg(ap, struct ps3_devdesc *);
	va_end(ap);

	if (dev->d_unit > 0) {
		dev_printf(dev, "attempt to open nonexistent disk");
		return ENXIO;
	}

	err = ps3stor_read_sectors(&stor_dev, dev->d_unit, 16, 1, 0, buf);
	if (err)
		return EIO;

	/* Do not attach if not ISO9660 (workaround for buggy firmware) */
	if (memcmp(buf, "\001CD001", 6) != 0)
		return EIO;

	return 0;
}
예제 #4
0
static int ps3cdrom_strategy(void *devdata, int flag, daddr_t dblk,
	size_t size, char *buf, size_t *rsize)
{
	struct ps3_devdesc *dev = (struct ps3_devdesc *) devdata;
	int err;

	DEBUG("d_unit=%u dblk=%llu size=%u", dev->d_unit, dblk, size);

	if (flag != F_READ) {
		dev_printf(dev, "write operation is not supported!");
		return EROFS;
	}

	if (dblk % (stor_dev.sd_blksize / DEV_BSIZE) != 0)
		return EINVAL;

	dblk /= (stor_dev.sd_blksize / DEV_BSIZE);

	if (size % stor_dev.sd_blksize) {
		dev_printf(dev,
		    "size=%u is not multiple of device block size=%llu", size,
		    stor_dev.sd_blksize);
		return EINVAL;
	}

	if (rsize)
		*rsize = 0;

	err = ps3stor_read_sectors(&stor_dev, dev->d_unit, dblk,
		size / stor_dev.sd_blksize, 0, buf);

	if (!err && rsize)
		*rsize = size;

	if (err)
		dev_printf(dev,
		    "read operation failed dblk=%llu size=%d err=%d", dblk,
		    size, err);

	return err;
}
예제 #5
0
/**
 * the DONE message
 */
void inf_done() {
  dev_printf("\n\033[0m\033[80m\033[7m * %s * \033[0m\n", WORD_DONE);
}