Re: [PATCH v3] Fix ibmvscsi client for multiplatform iSeries+pSeries kernel

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Paul,

It looks like there is a bunch of unrelated arch powerpc bits at the end
of this patch. 

-Brian

Paul Mackerras wrote:
> From: David Woodhouse <dwmw2@xxxxxxxxxxxxx>
> 
> If you build a multiplatform kernel for iSeries and pSeries, with
> ibmvscsic support, the resulting client doesn't work on iSeries.
> 
> This fixes that, using the appropriate low-level operations
> for the machine detected at runtime.
> 
> Signed-off-by: David Woodhouse <dwmw2@xxxxxxxxxxxxx>
> Acked by: Brian King <brking@xxxxxxxxxxxxxxxxxx>
> Signed-off-by: Paul Mackerras <paulus@xxxxxxxxx>
> ---
> This is being submitted for inclusion in 2.6.24.
> 
> ---
> diff --git a/drivers/scsi/ibmvscsi/rpa_vscsi.c b/drivers/scsi/ibmvscsi/rpa_vscsi.c
> index 9c14e78..1821461 100644
> --- a/drivers/scsi/ibmvscsi/rpa_vscsi.c
> +++ b/drivers/scsi/ibmvscsi/rpa_vscsi.c
> @@ -42,14 +42,14 @@ static unsigned int partition_number = -1;
>   * Routines for managing the command/response queue
>   */
>  /**
> - * ibmvscsi_handle_event: - Interrupt handler for crq events
> + * rpavscsi_handle_event: - Interrupt handler for crq events
>   * @irq:	number of irq to handle, not used
>   * @dev_instance: ibmvscsi_host_data of host that received interrupt
>   *
>   * Disables interrupts and schedules srp_task
>   * Always returns IRQ_HANDLED
>   */
> -static irqreturn_t ibmvscsi_handle_event(int irq, void *dev_instance)
> +static irqreturn_t rpavscsi_handle_event(int irq, void *dev_instance)
>  {
>  	struct ibmvscsi_host_data *hostdata =
>  	    (struct ibmvscsi_host_data *)dev_instance;
> @@ -66,9 +66,9 @@ static irqreturn_t ibmvscsi_handle_event(int irq, void *dev_instance)
>   * Frees irq, deallocates a page for messages, unmaps dma, and unregisters
>   * the crq with the hypervisor.
>   */
> -void ibmvscsi_release_crq_queue(struct crq_queue *queue,
> -				struct ibmvscsi_host_data *hostdata,
> -				int max_requests)
> +static void rpavscsi_release_crq_queue(struct crq_queue *queue,
> +				       struct ibmvscsi_host_data *hostdata,
> +				       int max_requests)
>  {
>  	long rc;
>  	struct vio_dev *vdev = to_vio_dev(hostdata->dev);
> @@ -108,12 +108,13 @@ static struct viosrp_crq *crq_queue_next_crq(struct crq_queue *queue)
>  }
> 
>  /**
> - * ibmvscsi_send_crq: - Send a CRQ
> + * rpavscsi_send_crq: - Send a CRQ
>   * @hostdata:	the adapter
>   * @word1:	the first 64 bits of the data
>   * @word2:	the second 64 bits of the data
>   */
> -int ibmvscsi_send_crq(struct ibmvscsi_host_data *hostdata, u64 word1, u64 word2)
> +static int rpavscsi_send_crq(struct ibmvscsi_host_data *hostdata,
> +			     u64 word1, u64 word2)
>  {
>  	struct vio_dev *vdev = to_vio_dev(hostdata->dev);
> 
> @@ -121,10 +122,10 @@ int ibmvscsi_send_crq(struct ibmvscsi_host_data *hostdata, u64 word1, u64 word2)
>  }
> 
>  /**
> - * ibmvscsi_task: - Process srps asynchronously
> + * rpavscsi_task: - Process srps asynchronously
>   * @data:	ibmvscsi_host_data of host
>   */
> -static void ibmvscsi_task(void *data)
> +static void rpavscsi_task(void *data)
>  {
>  	struct ibmvscsi_host_data *hostdata = (struct ibmvscsi_host_data *)data;
>  	struct vio_dev *vdev = to_vio_dev(hostdata->dev);
> @@ -190,6 +191,42 @@ static void set_adapter_info(struct ibmvscsi_host_data *hostdata)
>  }
> 
>  /**
> + * reset_crq_queue: - resets a crq after a failure
> + * @queue:	crq_queue to initialize and register
> + * @hostdata:	ibmvscsi_host_data of host
> + *
> + */
> +static int rpavscsi_reset_crq_queue(struct crq_queue *queue,
> +				    struct ibmvscsi_host_data *hostdata)
> +{
> +	int rc;
> +	struct vio_dev *vdev = to_vio_dev(hostdata->dev);
> +
> +	/* Close the CRQ */
> +	do {
> +		rc = plpar_hcall_norets(H_FREE_CRQ, vdev->unit_address);
> +	} while ((rc == H_BUSY) || (H_IS_LONG_BUSY(rc)));
> +
> +	/* Clean out the queue */
> +	memset(queue->msgs, 0x00, PAGE_SIZE);
> +	queue->cur = 0;
> +
> +	set_adapter_info(hostdata);
> +
> +	/* And re-open it again */
> +	rc = plpar_hcall_norets(H_REG_CRQ,
> +				vdev->unit_address,
> +				queue->msg_token, PAGE_SIZE);
> +	if (rc == 2) {
> +		/* Adapter is good, but other end is not ready */
> +		dev_warn(hostdata->dev, "Partner adapter not ready\n");
> +	} else if (rc != 0) {
> +		dev_warn(hostdata->dev, "couldn't register crq--rc 0x%x\n", rc);
> +	}
> +	return rc;
> +}
> +
> +/**
>   * initialize_crq_queue: - Initializes and registers CRQ with hypervisor
>   * @queue:	crq_queue to initialize and register
>   * @hostdata:	ibmvscsi_host_data of host
> @@ -198,9 +235,9 @@ static void set_adapter_info(struct ibmvscsi_host_data *hostdata)
>   * the crq with the hypervisor.
>   * Returns zero on success.
>   */
> -int ibmvscsi_init_crq_queue(struct crq_queue *queue,
> -			    struct ibmvscsi_host_data *hostdata,
> -			    int max_requests)
> +static int rpavscsi_init_crq_queue(struct crq_queue *queue,
> +				   struct ibmvscsi_host_data *hostdata,
> +				   int max_requests)
>  {
>  	int rc;
>  	int retrc;
> @@ -227,7 +264,7 @@ int ibmvscsi_init_crq_queue(struct crq_queue *queue,
>  				queue->msg_token, PAGE_SIZE);
>  	if (rc == H_RESOURCE)
>  		/* maybe kexecing and resource is busy. try a reset */
> -		rc = ibmvscsi_reset_crq_queue(queue,
> +		rc = rpavscsi_reset_crq_queue(queue,
>  					      hostdata);
> 
>  	if (rc == 2) {
> @@ -240,7 +277,7 @@ int ibmvscsi_init_crq_queue(struct crq_queue *queue,
>  	}
> 
>  	if (request_irq(vdev->irq,
> -			ibmvscsi_handle_event,
> +			rpavscsi_handle_event,
>  			0, "ibmvscsi", (void *)hostdata) != 0) {
>  		dev_err(hostdata->dev, "couldn't register irq 0x%x\n",
>  			vdev->irq);
> @@ -256,7 +293,7 @@ int ibmvscsi_init_crq_queue(struct crq_queue *queue,
>  	queue->cur = 0;
>  	spin_lock_init(&queue->lock);
> 
> -	tasklet_init(&hostdata->srp_task, (void *)ibmvscsi_task,
> +	tasklet_init(&hostdata->srp_task, (void *)rpavscsi_task,
>  		     (unsigned long)hostdata);
> 
>  	return retrc;
> @@ -281,8 +318,8 @@ int ibmvscsi_init_crq_queue(struct crq_queue *queue,
>   * @hostdata:	ibmvscsi_host_data of host
>   *
>   */
> -int ibmvscsi_reenable_crq_queue(struct crq_queue *queue,
> -				 struct ibmvscsi_host_data *hostdata)
> +static int rpavscsi_reenable_crq_queue(struct crq_queue *queue,
> +				       struct ibmvscsi_host_data *hostdata)
>  {
>  	int rc;
>  	struct vio_dev *vdev = to_vio_dev(hostdata->dev);
> @@ -297,38 +334,10 @@ int ibmvscsi_reenable_crq_queue(struct crq_queue *queue,
>  	return rc;
>  }
> 
> -/**
> - * reset_crq_queue: - resets a crq after a failure
> - * @queue:	crq_queue to initialize and register
> - * @hostdata:	ibmvscsi_host_data of host
> - *
> - */
> -int ibmvscsi_reset_crq_queue(struct crq_queue *queue,
> -			      struct ibmvscsi_host_data *hostdata)
> -{
> -	int rc;
> -	struct vio_dev *vdev = to_vio_dev(hostdata->dev);
> -
> -	/* Close the CRQ */
> -	do {
> -		rc = plpar_hcall_norets(H_FREE_CRQ, vdev->unit_address);
> -	} while ((rc == H_BUSY) || (H_IS_LONG_BUSY(rc)));
> -
> -	/* Clean out the queue */
> -	memset(queue->msgs, 0x00, PAGE_SIZE);
> -	queue->cur = 0;
> -
> -	set_adapter_info(hostdata);
> -
> -	/* And re-open it again */
> -	rc = plpar_hcall_norets(H_REG_CRQ,
> -				vdev->unit_address,
> -				queue->msg_token, PAGE_SIZE);
> -	if (rc == 2) {
> -		/* Adapter is good, but other end is not ready */
> -		dev_warn(hostdata->dev, "Partner adapter not ready\n");
> -	} else if (rc != 0) {
> -		dev_warn(hostdata->dev, "couldn't register crq--rc 0x%x\n", rc);
> -	}
> -	return rc;
> -}
> +struct ibmvscsi_ops rpavscsi_ops = {
> +	.init_crq_queue = rpavscsi_init_crq_queue,
> +	.release_crq_queue = rpavscsi_release_crq_queue,
> +	.reset_crq_queue = rpavscsi_reset_crq_queue,
> +	.reenable_crq_queue = rpavscsi_reenable_crq_queue,
> +	.send_crq = rpavscsi_send_crq,
> +};
> diff --git a/drivers/scsi/ibmvscsi/ibmvscsi.c b/drivers/scsi/ibmvscsi/ibmvscsi.c
> index 5870866..ed9b675 100644
> --- a/drivers/scsi/ibmvscsi/ibmvscsi.c
> +++ b/drivers/scsi/ibmvscsi/ibmvscsi.c
> @@ -70,6 +70,7 @@
>  #include <linux/moduleparam.h>
>  #include <linux/dma-mapping.h>
>  #include <linux/delay.h>
> +#include <asm/firmware.h>
>  #include <asm/vio.h>
>  #include <scsi/scsi.h>
>  #include <scsi/scsi_cmnd.h>
> @@ -89,6 +90,8 @@ static int max_requests = IBMVSCSI_MAX_REQUESTS_DEFAULT;
> 
>  #define IBMVSCSI_VERSION "1.5.8"
> 
> +static struct ibmvscsi_ops *ibmvscsi_ops;
> +
>  MODULE_DESCRIPTION("IBM Virtual SCSI");
>  MODULE_AUTHOR("Dave Boutcher");
>  MODULE_LICENSE("GPL");
> @@ -512,8 +515,8 @@ static void ibmvscsi_reset_host(struct ibmvscsi_host_data *hostdata)
>  	atomic_set(&hostdata->request_limit, 0);
> 
>  	purge_requests(hostdata, DID_ERROR);
> -	if ((ibmvscsi_reset_crq_queue(&hostdata->queue, hostdata)) ||
> -	    (ibmvscsi_send_crq(hostdata, 0xC001000000000000LL, 0)) ||
> +	if ((ibmvscsi_ops->reset_crq_queue(&hostdata->queue, hostdata)) ||
> +	    (ibmvscsi_ops->send_crq(hostdata, 0xC001000000000000LL, 0)) ||
>  	    (vio_enable_interrupts(to_vio_dev(hostdata->dev)))) {
>  		atomic_set(&hostdata->request_limit, -1);
>  		dev_err(hostdata->dev, "error after reset\n");
> @@ -618,7 +621,7 @@ static int ibmvscsi_send_srp_event(struct srp_event_struct *evt_struct,
>  	}
> 
>  	if ((rc =
> -	     ibmvscsi_send_crq(hostdata, crq_as_u64[0], crq_as_u64[1])) != 0) {
> +	     ibmvscsi_ops->send_crq(hostdata, crq_as_u64[0], crq_as_u64[1])) != 0) {
>  		list_del(&evt_struct->list);
>  		del_timer(&evt_struct->timer);
> 
> @@ -1222,8 +1225,8 @@ void ibmvscsi_handle_crq(struct viosrp_crq *crq,
>  		case 0x01:	/* Initialization message */
>  			dev_info(hostdata->dev, "partner initialized\n");
>  			/* Send back a response */
> -			if ((rc = ibmvscsi_send_crq(hostdata,
> -						    0xC002000000000000LL, 0)) == 0) {
> +			if ((rc = ibmvscsi_ops->send_crq(hostdata,
> +							 0xC002000000000000LL, 0)) == 0) {
>  				/* Now login */
>  				send_srp_login(hostdata);
>  			} else {
> @@ -1248,10 +1251,10 @@ void ibmvscsi_handle_crq(struct viosrp_crq *crq,
>  			/* We need to re-setup the interpartition connection */
>  			dev_info(hostdata->dev, "Re-enabling adapter!\n");
>  			purge_requests(hostdata, DID_REQUEUE);
> -			if ((ibmvscsi_reenable_crq_queue(&hostdata->queue,
> -							hostdata)) ||
> -			    (ibmvscsi_send_crq(hostdata,
> -					       0xC001000000000000LL, 0))) {
> +			if ((ibmvscsi_ops->reenable_crq_queue(&hostdata->queue,
> +							      hostdata)) ||
> +			    (ibmvscsi_ops->send_crq(hostdata,
> +						    0xC001000000000000LL, 0))) {
>  					atomic_set(&hostdata->request_limit,
>  						   -1);
>  					dev_err(hostdata->dev, "error after enable\n");
> @@ -1261,10 +1264,10 @@ void ibmvscsi_handle_crq(struct viosrp_crq *crq,
>  				crq->format);
> 
>  			purge_requests(hostdata, DID_ERROR);
> -			if ((ibmvscsi_reset_crq_queue(&hostdata->queue,
> -							hostdata)) ||
> -			    (ibmvscsi_send_crq(hostdata,
> -					       0xC001000000000000LL, 0))) {
> +			if ((ibmvscsi_ops->reset_crq_queue(&hostdata->queue,
> +							   hostdata)) ||
> +			    (ibmvscsi_ops->send_crq(hostdata,
> +						    0xC001000000000000LL, 0))) {
>  					atomic_set(&hostdata->request_limit,
>  						   -1);
>  					dev_err(hostdata->dev, "error after reset\n");
> @@ -1590,7 +1593,7 @@ static int ibmvscsi_probe(struct vio_dev *vdev, const struct vio_device_id *id)
>  	atomic_set(&hostdata->request_limit, -1);
>  	hostdata->host->max_sectors = 32 * 8; /* default max I/O 32 pages */
> 
> -	rc = ibmvscsi_init_crq_queue(&hostdata->queue, hostdata, max_requests);
> +	rc = ibmvscsi_ops->init_crq_queue(&hostdata->queue, hostdata, max_requests);
>  	if (rc != 0 && rc != H_RESOURCE) {
>  		dev_err(&vdev->dev, "couldn't initialize crq. rc=%d\n", rc);
>  		goto init_crq_failed;
> @@ -1611,7 +1614,7 @@ static int ibmvscsi_probe(struct vio_dev *vdev, const struct vio_device_id *id)
>  	 * to fail if the other end is not acive.  In that case we don't
>  	 * want to scan
>  	 */
> -	if (ibmvscsi_send_crq(hostdata, 0xC001000000000000LL, 0) == 0
> +	if (ibmvscsi_ops->send_crq(hostdata, 0xC001000000000000LL, 0) == 0
>  	    || rc == H_RESOURCE) {
>  		/*
>  		 * Wait around max init_timeout secs for the adapter to finish
> @@ -1637,7 +1640,7 @@ static int ibmvscsi_probe(struct vio_dev *vdev, const struct vio_device_id *id)
>        add_host_failed:
>  	release_event_pool(&hostdata->pool, hostdata);
>        init_pool_failed:
> -	ibmvscsi_release_crq_queue(&hostdata->queue, hostdata, max_requests);
> +	ibmvscsi_ops->release_crq_queue(&hostdata->queue, hostdata, max_requests);
>        init_crq_failed:
>  	scsi_host_put(host);
>        scsi_host_alloc_failed:
> @@ -1648,8 +1651,8 @@ static int ibmvscsi_remove(struct vio_dev *vdev)
>  {
>  	struct ibmvscsi_host_data *hostdata = vdev->dev.driver_data;
>  	release_event_pool(&hostdata->pool, hostdata);
> -	ibmvscsi_release_crq_queue(&hostdata->queue, hostdata,
> -				   max_requests);
> +	ibmvscsi_ops->release_crq_queue(&hostdata->queue, hostdata,
> +					max_requests);
>  	
>  	scsi_remove_host(hostdata->host);
>  	scsi_host_put(hostdata->host);
> @@ -1679,6 +1682,13 @@ static struct vio_driver ibmvscsi_driver = {
> 
>  int __init ibmvscsi_module_init(void)
>  {
> +	if (firmware_has_feature(FW_FEATURE_ISERIES))
> +		ibmvscsi_ops = &iseriesvscsi_ops;
> +	else if (firmware_has_feature(FW_FEATURE_VIO))
> +		ibmvscsi_ops = &rpavscsi_ops;
> +	else
> +		return -ENODEV;
> +
>  	return vio_register_driver(&ibmvscsi_driver);
>  }
> 
> diff --git a/drivers/scsi/ibmvscsi/ibmvscsi.h b/drivers/scsi/ibmvscsi/ibmvscsi.h
> index b19c2e2..46e850e 100644
> --- a/drivers/scsi/ibmvscsi/ibmvscsi.h
> +++ b/drivers/scsi/ibmvscsi/ibmvscsi.h
> @@ -98,21 +98,25 @@ struct ibmvscsi_host_data {
>  };
> 
>  /* routines for managing a command/response queue */
> -int ibmvscsi_init_crq_queue(struct crq_queue *queue,
> -			    struct ibmvscsi_host_data *hostdata,
> -			    int max_requests);
> -void ibmvscsi_release_crq_queue(struct crq_queue *queue,
> -				struct ibmvscsi_host_data *hostdata,
> -				int max_requests);
> -int ibmvscsi_reset_crq_queue(struct crq_queue *queue,
> -			      struct ibmvscsi_host_data *hostdata);
> -
> -int ibmvscsi_reenable_crq_queue(struct crq_queue *queue,
> -				struct ibmvscsi_host_data *hostdata);
> -
>  void ibmvscsi_handle_crq(struct viosrp_crq *crq,
>  			 struct ibmvscsi_host_data *hostdata);
> -int ibmvscsi_send_crq(struct ibmvscsi_host_data *hostdata,
> -		      u64 word1, u64 word2);
> +
> +struct ibmvscsi_ops {
> +	int (*init_crq_queue)(struct crq_queue *queue,
> +			      struct ibmvscsi_host_data *hostdata,
> +			      int max_requests);
> +	void (*release_crq_queue)(struct crq_queue *queue,
> +				  struct ibmvscsi_host_data *hostdata,
> +				  int max_requests);
> +	int (*reset_crq_queue)(struct crq_queue *queue,
> +			       struct ibmvscsi_host_data *hostdata);
> +	int (*reenable_crq_queue)(struct crq_queue *queue,
> +				  struct ibmvscsi_host_data *hostdata);
> +	int (*send_crq)(struct ibmvscsi_host_data *hostdata,
> +		       u64 word1, u64 word2);
> +};
> +
> +extern struct ibmvscsi_ops iseriesvscsi_ops;
> +extern struct ibmvscsi_ops rpavscsi_ops;
> 
>  #endif				/* IBMVSCSI_H */
> diff --git a/drivers/scsi/ibmvscsi/iseries_vscsi.c b/drivers/scsi/ibmvscsi/iseries_vscsi.c
> index 6aeb5f0..0775fde 100644
> --- a/drivers/scsi/ibmvscsi/iseries_vscsi.c
> +++ b/drivers/scsi/ibmvscsi/iseries_vscsi.c
> @@ -53,7 +53,7 @@ struct srp_lp_event {
>  /** 
>   * standard interface for handling logical partition events.
>   */
> -static void ibmvscsi_handle_event(struct HvLpEvent *lpevt)
> +static void iseriesvscsi_handle_event(struct HvLpEvent *lpevt)
>  {
>  	struct srp_lp_event *evt = (struct srp_lp_event *)lpevt;
> 
> @@ -74,9 +74,9 @@ static void ibmvscsi_handle_event(struct HvLpEvent *lpevt)
>  /* ------------------------------------------------------------
>   * Routines for driver initialization
>   */
> -int ibmvscsi_init_crq_queue(struct crq_queue *queue,
> -			    struct ibmvscsi_host_data *hostdata,
> -			    int max_requests)
> +static int iseriesvscsi_init_crq_queue(struct crq_queue *queue,
> +				       struct ibmvscsi_host_data *hostdata,
> +				       int max_requests)
>  {
>  	int rc;
> 
> @@ -88,7 +88,7 @@ int ibmvscsi_init_crq_queue(struct crq_queue *queue,
>  		goto viopath_open_failed;
>  	}
> 
> -	rc = vio_setHandler(viomajorsubtype_scsi, ibmvscsi_handle_event);
> +	rc = vio_setHandler(viomajorsubtype_scsi, iseriesvscsi_handle_event);
>  	if (rc < 0) {
>  		printk("vio_setHandler failed with rc %d in open_event_path\n",
>  		       rc);
> @@ -102,9 +102,9 @@ int ibmvscsi_init_crq_queue(struct crq_queue *queue,
>  	return -1;
>  }
> 
> -void ibmvscsi_release_crq_queue(struct crq_queue *queue,
> -				struct ibmvscsi_host_data *hostdata,
> -				int max_requests)
> +static void iseriesvscsi_release_crq_queue(struct crq_queue *queue,
> +					   struct ibmvscsi_host_data *hostdata,
> +					   int max_requests)
>  {
>  	vio_clearHandler(viomajorsubtype_scsi);
>  	viopath_close(viopath_hostLp, viomajorsubtype_scsi, max_requests);
> @@ -117,8 +117,8 @@ void ibmvscsi_release_crq_queue(struct crq_queue *queue,
>   *
>   * no-op for iSeries
>   */
> -int ibmvscsi_reset_crq_queue(struct crq_queue *queue,
> -			      struct ibmvscsi_host_data *hostdata)
> +static int iseriesvscsi_reset_crq_queue(struct crq_queue *queue,
> +					struct ibmvscsi_host_data *hostdata)
>  {
>  	return 0;
>  }
> @@ -130,19 +130,20 @@ int ibmvscsi_reset_crq_queue(struct crq_queue *queue,
>   *
>   * no-op for iSeries
>   */
> -int ibmvscsi_reenable_crq_queue(struct crq_queue *queue,
> -				struct ibmvscsi_host_data *hostdata)
> +static int iseriesvscsi_reenable_crq_queue(struct crq_queue *queue,
> +					   struct ibmvscsi_host_data *hostdata)
>  {
>  	return 0;
>  }
> 
>  /**
> - * ibmvscsi_send_crq: - Send a CRQ
> + * iseriesvscsi_send_crq: - Send a CRQ
>   * @hostdata:	the adapter
>   * @word1:	the first 64 bits of the data
>   * @word2:	the second 64 bits of the data
>   */
> -int ibmvscsi_send_crq(struct ibmvscsi_host_data *hostdata, u64 word1, u64 word2)
> +static int iseriesvscsi_send_crq(struct ibmvscsi_host_data *hostdata,
> +				 u64 word1, u64 word2)
>  {
>  	single_host_data = hostdata;
>  	return HvCallEvent_signalLpEventFast(viopath_hostLp,
> @@ -156,3 +157,11 @@ int ibmvscsi_send_crq(struct ibmvscsi_host_data *hostdata, u64 word1, u64 word2)
>  					     VIOVERSION << 16, word1, word2, 0,
>  					     0);
>  }
> +
> +struct ibmvscsi_ops iseriesvscsi_ops = {
> +	.init_crq_queue = iseriesvscsi_init_crq_queue,
> +	.release_crq_queue = iseriesvscsi_release_crq_queue,
> +	.reset_crq_queue = iseriesvscsi_reset_crq_queue,
> +	.reenable_crq_queue = iseriesvscsi_reenable_crq_queue,
> +	.send_crq = iseriesvscsi_send_crq,
> +};
> diff --git a/drivers/scsi/ibmvscsi/Makefile b/drivers/scsi/ibmvscsi/Makefile
> index f67d9ef..6ac0633 100644
> --- a/drivers/scsi/ibmvscsi/Makefile
> +++ b/drivers/scsi/ibmvscsi/Makefile
> @@ -1,9 +1,7 @@
>  obj-$(CONFIG_SCSI_IBMVSCSI)	+= ibmvscsic.o
> 
>  ibmvscsic-y			+= ibmvscsi.o
> -ifndef CONFIG_PPC_PSERIES
>  ibmvscsic-$(CONFIG_PPC_ISERIES)	+= iseries_vscsi.o 
> -endif
>  ibmvscsic-$(CONFIG_PPC_PSERIES)	+= rpa_vscsi.o 
> 
>  obj-$(CONFIG_SCSI_IBMVSCSIS)	+= ibmvstgt.o
> 
>>From mathieu.desnoyers@xxxxxxxxxx Tue Aug 28 01:52:38 2007
> From: Mathieu Desnoyers <mathieu.desnoyers@xxxxxxxxxx>
> Subject: [patch 04/28] Add cmpxchg64 and cmpxchg64_local to powerpc
> Date: Tue, 28 Aug 2007 01:52:38 +1000
> X-Patchwork-ID: 13137
> 
> Make sure that at least cmpxchg64_local is available on all
> architectures to use for unsigned long long values.
> 
> Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@xxxxxxxxxx>
> ---
>  include/asm-powerpc/system.h |    6 ++++++
>  1 file changed, 6 insertions(+)
> 
> 
> 
> 
> ---
> Index: linux-2.6-lttng/include/asm-powerpc/system.h
> ===================================================================
> --- linux-2.6-lttng.orig/include/asm-powerpc/system.h	2007-08-27 11:42:08.000000000 -0400
> +++ linux-2.6-lttng/include/asm-powerpc/system.h	2007-08-27 11:42:43.000000000 -0400
> @@ -485,6 +485,12 @@ __cmpxchg_local(volatile void *ptr, unsi
>   */
>  #define NET_IP_ALIGN	0
>  #define NET_SKB_PAD	L1_CACHE_BYTES
> +
> +#define cmpxchg64	cmpxchg
> +#define cmpxchg64_local	cmpxchg_local
> +#else
> +#include <asm-generic/cmpxchg-local.h>
> +#define cmpxchg64_local(ptr,o,n) __cmpxchg64_local_generic((ptr), (o), (n))
>  #endif
> 
>  #define arch_align_stack(x) (x)
> 
>>From grant.likely@xxxxxxxxxxxx Fri Aug 31 06:26:24 2007
> From: Grant Likely <grant.likely@xxxxxxxxxxxx>
> Subject: [PATCH 2/3] mpc8349: Add linux,network-index to ethernet nodes in device tree
> Date: Fri, 31 Aug 2007 06:26:24 +1000
> X-Patchwork-ID: 13235
> 
> From: Grant Likely <grant.likely@xxxxxxxxxxxx>
> 
> cuImage needs to know the logical index of the ethernet devices in order
> to assign mac addresses.  This adds the needed properties.
> 
> Signed-off-by: Grant Likely <grant.likely@xxxxxxxxxxxx>
> Acked-by: David Gibson <david@xxxxxxxxxxxxxxxxxxxxx>
> CC: Scott Wood <scottwood@xxxxxxxxxxxxx>
> CC: Kumar Gala <galak@xxxxxxxxxxxxxxxxxxx>
> CC: Timur Tabi <timur@xxxxxxxxxxxxx>
> ---
> 
>  arch/powerpc/boot/dts/mpc8349emitx.dts   |    2 ++
>  arch/powerpc/boot/dts/mpc8349emitxgp.dts |    1 +
>  arch/powerpc/boot/dts/mpc834x_mds.dts    |    2 ++
>  3 files changed, 5 insertions(+), 0 deletions(-)
> 
> 
> ---
> diff --git a/arch/powerpc/boot/dts/mpc8349emitx.dts b/arch/powerpc/boot/dts/mpc8349emitx.dts
> index 502f47c..a4e2284 100644
> --- a/arch/powerpc/boot/dts/mpc8349emitx.dts
> +++ b/arch/powerpc/boot/dts/mpc8349emitx.dts
> @@ -141,6 +141,7 @@
>  			interrupts = <20 8 21 8 22 8>;
>  			interrupt-parent = < &ipic >;
>  			phy-handle = < &phy1c >;
> +			linux,network-index = <0>;
>  		};
> 
>  		ethernet@25000 {
> @@ -160,6 +161,7 @@
>  			interrupts = <23 8 24 8 25 8>;
>  			interrupt-parent = < &ipic >;
>  			phy-handle = < &phy1f >;
> +			linux,network-index = <1>;
>  		};
> 
>  		serial@4500 {
> diff --git a/arch/powerpc/boot/dts/mpc8349emitxgp.dts b/arch/powerpc/boot/dts/mpc8349emitxgp.dts
> index 0b83871..004b737 100644
> --- a/arch/powerpc/boot/dts/mpc8349emitxgp.dts
> +++ b/arch/powerpc/boot/dts/mpc8349emitxgp.dts
> @@ -116,6 +116,7 @@
>  			interrupts = <20 8 21 8 22 8>;
>  			interrupt-parent = < &ipic >;
>  			phy-handle = < &phy1c >;
> +			linux,network-index = <0>;
>  		};
> 
>  		serial@4500 {
> diff --git a/arch/powerpc/boot/dts/mpc834x_mds.dts b/arch/powerpc/boot/dts/mpc834x_mds.dts
> index 4810997..251c233 100644
> --- a/arch/powerpc/boot/dts/mpc834x_mds.dts
> +++ b/arch/powerpc/boot/dts/mpc834x_mds.dts
> @@ -146,6 +146,7 @@
>  			interrupts = <20 8 21 8 22 8>;
>  			interrupt-parent = < &ipic >;
>  			phy-handle = < &phy0 >;
> +			linux,network-index = <0>;
>  		};
> 
>  		ethernet@25000 {
> @@ -165,6 +166,7 @@
>  			interrupts = <23 8 24 8 25 8>;
>  			interrupt-parent = < &ipic >;
>  			phy-handle = < &phy1 >;
> +			linux,network-index = <1>;
>  		};
> 
>  		serial@4500 {
> 
>>From grant.likely@xxxxxxxxxxxx Sat Sep  1 03:34:37 2007
> From: Grant Likely <grant.likely@xxxxxxxxxxxx>
> Subject: mpc5200: Add cuimage support for mpc5200 boards
> Date: Sat, 01 Sep 2007 03:34:37 +1000
> X-Patchwork-ID: 13249
> 
> From: Grant Likely <grant.likely@xxxxxxxxxxxx>
> 
> Signed-off-by: Grant Likely <grant.likely@xxxxxxxxxxxx>
> Acked-by: David Gibson <david@xxxxxxxxxxxxxxxxxxxxx>
> ---
> 
>  arch/powerpc/boot/Makefile          |    5 ++-
>  arch/powerpc/boot/cuboot-52xx.c     |   59 ++++++++++++++++++++++++++++++
>  arch/powerpc/boot/mpc52xx-psc.c     |   69 +++++++++++++++++++++++++++++++++++
>  arch/powerpc/boot/ops.h             |    1 +
>  arch/powerpc/boot/serial.c          |    2 +
>  arch/powerpc/platforms/52xx/Kconfig |    1 +
>  6 files changed, 135 insertions(+), 2 deletions(-)
> 
> 
> ---
> diff --git a/arch/powerpc/boot/Makefile b/arch/powerpc/boot/Makefile
> index cd7c057..45be0e5 100644
> --- a/arch/powerpc/boot/Makefile
> +++ b/arch/powerpc/boot/Makefile
> @@ -45,8 +45,8 @@ src-wlib := string.S crt0.S stdio.c main.c flatdevtree.c flatdevtree_misc.c \
>  		ns16550.c serial.c simple_alloc.c div64.S util.S \
>  		gunzip_util.c elf_util.c $(zlib) devtree.c oflib.c ofconsole.c \
>  		4xx.c ebony.c mv64x60.c mpsc.c mv64x60_i2c.c cuboot.c bamboo.c \
> -		cpm-serial.c
> -src-plat := of.c cuboot-83xx.c cuboot-85xx.c holly.c \
> +		cpm-serial.c mpc52xx-psc.c
> +src-plat := of.c cuboot-52xx.c cuboot-83xx.c cuboot-85xx.c holly.c \
>  		cuboot-ebony.c treeboot-ebony.c prpmc2800.c \
>  		ps3-head.S ps3-hvcall.S ps3.c treeboot-bamboo.c cuboot-8xx.c cuboot-pq2.c
>  src-boot := $(src-wlib) $(src-plat) empty.c
> @@ -142,6 +142,7 @@ image-$(CONFIG_DEFAULT_UIMAGE)		+= uImage
>  ifneq ($(CONFIG_DEVICE_TREE),"")
>  image-$(CONFIG_PPC_8xx)			+= cuImage.8xx
>  image-$(CONFIG_8260)			+= cuImage.pq2
> +image-$(CONFIG_PPC_MPC52xx)		+= cuImage.52xx
>  image-$(CONFIG_PPC_83xx)		+= cuImage.83xx
>  image-$(CONFIG_PPC_85xx)		+= cuImage.85xx
>  image-$(CONFIG_EBONY)			+= treeImage.ebony cuImage.ebony
> diff --git a/arch/powerpc/boot/cuboot-52xx.c b/arch/powerpc/boot/cuboot-52xx.c
> new file mode 100644
> index 0000000..9256a26
> --- /dev/null
> +++ b/arch/powerpc/boot/cuboot-52xx.c
> @@ -0,0 +1,59 @@
> +/*
> + * Old U-boot compatibility for MPC5200
> + *
> + * Author: Grant Likely <grant.likely@xxxxxxxxxxxx>
> + *
> + * Copyright (c) 2007 Secret Lab Technologies Ltd.
> + * Copyright (c) 2007 Freescale Semiconductor, Inc.
> + *
> + * This program is free software; you can redistribute it and/or modify it
> + * under the terms of the GNU General Public License version 2 as published
> + * by the Free Software Foundation.
> + */
> +
> +#include "ops.h"
> +#include "stdio.h"
> +#include "io.h"
> +#include "cuboot.h"
> +
> +#define TARGET_PPC_MPC52xx
> +#include "ppcboot.h"
> +
> +static bd_t bd;
> +
> +static void platform_fixups(void)
> +{
> +	void *soc, *reg;
> +	int div;
> +	u32 sysfreq;
> +
> +
> +	dt_fixup_memory(bd.bi_memstart, bd.bi_memsize);
> +	dt_fixup_mac_addresses(bd.bi_enetaddr);
> +	dt_fixup_cpu_clocks(bd.bi_intfreq, bd.bi_busfreq / 4, bd.bi_busfreq);
> +
> +	/* Unfortunately, the specific model number is encoded in the
> +	 * soc node name in existing dts files -- once that is fixed,
> +	 * this can do a simple path lookup.
> +	 */
> +	soc = find_node_by_devtype(NULL, "soc");
> +	if (soc) {
> +		setprop(soc, "bus-frequency", &bd.bi_ipbfreq,
> +			sizeof(bd.bi_ipbfreq));
> +
> +		if (!dt_xlate_reg(soc, 0, (void*)&reg, NULL))
> +			return;
> +		div = in_8(reg + 0x204) & 0x0020 ? 8 : 4;
> +		sysfreq = bd.bi_busfreq * div;
> +		setprop(soc, "system-frequency", &sysfreq, sizeof(sysfreq));
> +	}
> +}
> +
> +void platform_init(unsigned long r3, unsigned long r4, unsigned long r5,
> +                   unsigned long r6, unsigned long r7)
> +{
> +	CUBOOT_INIT();
> +	ft_init(_dtb_start, _dtb_end - _dtb_start, 32);
> +	serial_console_init();
> +	platform_ops.fixups = platform_fixups;
> +}
> diff --git a/arch/powerpc/boot/mpc52xx-psc.c b/arch/powerpc/boot/mpc52xx-psc.c
> new file mode 100644
> index 0000000..1074626
> --- /dev/null
> +++ b/arch/powerpc/boot/mpc52xx-psc.c
> @@ -0,0 +1,69 @@
> +/*
> + * MPC5200 PSC serial console support.
> + *
> + * Author: Grant Likely <grant.likely@xxxxxxxxxxxx>
> + *
> + * Copyright (c) 2007 Secret Lab Technologies Ltd.
> + * Copyright (c) 2007 Freescale Semiconductor, Inc.
> + *
> + * It is assumed that the firmware (or the platform file) has already set
> + * up the port.
> + */
> +
> +#include "types.h"
> +#include "io.h"
> +#include "ops.h"
> +
> +/* Programmable Serial Controller (PSC) status register bits */
> +#define MPC52xx_PSC_SR		0x04
> +#define MPC52xx_PSC_SR_RXRDY		0x0100
> +#define MPC52xx_PSC_SR_RXFULL		0x0200
> +#define MPC52xx_PSC_SR_TXRDY		0x0400
> +#define MPC52xx_PSC_SR_TXEMP		0x0800
> +
> +#define MPC52xx_PSC_BUFFER	0x0C
> +
> +static void *psc;
> +
> +static int psc_open(void)
> +{
> +	/* Assume the firmware has already configured the PSC into
> +	 * uart mode */
> +	return 0;
> +}
> +
> +static void psc_putc(unsigned char c)
> +{
> +	while (!(in_be16(psc + MPC52xx_PSC_SR) & MPC52xx_PSC_SR_TXRDY)) ;
> +	out_8(psc + MPC52xx_PSC_BUFFER, c);
> +}
> +
> +static unsigned char psc_tstc(void)
> +{
> +	return (in_be16(psc + MPC52xx_PSC_SR) & MPC52xx_PSC_SR_RXRDY) != 0;
> +}
> +
> +static unsigned char psc_getc(void)
> +{
> +	while (!(in_be16(psc + MPC52xx_PSC_SR) & MPC52xx_PSC_SR_RXRDY)) ;
> +	return in_8(psc + MPC52xx_PSC_BUFFER);
> +}
> +
> +int mpc5200_psc_console_init(void *devp, struct serial_console_data *scdp)
> +{
> +	int n;
> +
> +	/* Get the base address of the psc registers */
> +	n = getprop(devp, "virtual-reg", &psc, sizeof(psc));
> +	if (n != sizeof(psc)) {
> +		if (!dt_xlate_reg(devp, 0, (void *)&psc, NULL))
> +			return -1;
> +	}
> +
> +	scdp->open = psc_open;
> +	scdp->putc = psc_putc;
> +	scdp->getc = psc_getc;
> +	scdp->tstc = psc_tstc;
> +
> +	return 0;
> +}
> diff --git a/arch/powerpc/boot/ops.h b/arch/powerpc/boot/ops.h
> index 45c2268..5ab9b51 100644
> --- a/arch/powerpc/boot/ops.h
> +++ b/arch/powerpc/boot/ops.h
> @@ -83,6 +83,7 @@ int serial_console_init(void);
>  int ns16550_console_init(void *devp, struct serial_console_data *scdp);
>  int mpsc_console_init(void *devp, struct serial_console_data *scdp);
>  int cpm_console_init(void *devp, struct serial_console_data *scdp);
> +int mpc5200_psc_console_init(void *devp, struct serial_console_data *scdp);
>  void *simple_alloc_init(char *base, unsigned long heap_size,
>  			unsigned long granularity, unsigned long max_allocs);
>  extern void flush_cache(void *, unsigned long);
> diff --git a/arch/powerpc/boot/serial.c b/arch/powerpc/boot/serial.c
> index d47f8e0..95e08e4 100644
> --- a/arch/powerpc/boot/serial.c
> +++ b/arch/powerpc/boot/serial.c
> @@ -126,6 +126,8 @@ int serial_console_init(void)
>  	         dt_is_compatible(devp, "fsl,cpm2-scc-uart") ||
>  	         dt_is_compatible(devp, "fsl,cpm2-smc-uart"))
>  		rc = cpm_console_init(devp, &serial_cd);
> +	else if (dt_is_compatible(devp, "mpc5200-psc-uart"))
> +		rc = mpc5200_psc_console_init(devp, &serial_cd);
> 
>  	/* Add other serial console driver calls here */
> 
> diff --git a/arch/powerpc/platforms/52xx/Kconfig b/arch/powerpc/platforms/52xx/Kconfig
> index 3ffaa06..9ddf251 100644
> --- a/arch/powerpc/platforms/52xx/Kconfig
> +++ b/arch/powerpc/platforms/52xx/Kconfig
> @@ -30,6 +30,7 @@ config PPC_EFIKA
>  config PPC_LITE5200
>  	bool "Freescale Lite5200 Eval Board"
>  	depends on PPC_MULTIPLATFORM && PPC32
> +	select WANT_DEVICE_TREE
>  	select PPC_MPC5200
>  	default n
> 
> 
>>From tony@xxxxxxxxxxxxxxxxxx Wed Sep 12 13:58:54 2007
> From: Tony Breeds <tony@xxxxxxxxxxxxxxxxxx>
> Subject: Convert define_machine(mpc885_ads) to C99 initializer syntax
> Date: Wed, 12 Sep 2007 13:58:54 +1000
> X-Patchwork-ID: 13372
> 
> Make the define_machine() block for mpc885_ads more greppable and
> consistent with other examples in tree.
> 
> Signed-off-by: Tony Breeds <tony@xxxxxxxxxxxxxxxxxx>
> 
> ---
> 
>  arch/powerpc/platforms/8xx/mpc885ads_setup.c |   17 +++++++++++------
>  1 file changed, 11 insertions(+), 6 deletions(-)
> 
> 
> Yours Tony
> 
>   linux.conf.au        http://linux.conf.au/ || http://lca2008.linux.org.au/
>   Jan 28 - Feb 02 2008 The Australian Linux Technical Conference!
> 
> 
> ---
> Index: working/arch/powerpc/platforms/8xx/mpc885ads_setup.c
> ===================================================================
> --- working.orig/arch/powerpc/platforms/8xx/mpc885ads_setup.c	2007-09-10 16:56:54.000000000 +1000
> +++ working/arch/powerpc/platforms/8xx/mpc885ads_setup.c	2007-09-12 13:53:17.000000000 +1000
> @@ -441,9 +441,14 @@ static int __init mpc885ads_probe(void)
> 
>  define_machine(mpc885_ads)
>  {
> -.name = "MPC885 ADS",.probe = mpc885ads_probe,.setup_arch =
> -	    mpc885ads_setup_arch,.init_IRQ =
> -	    m8xx_pic_init,.show_cpuinfo = mpc8xx_show_cpuinfo,.get_irq =
> -	    mpc8xx_get_irq,.restart = mpc8xx_restart,.calibrate_decr =
> -	    mpc8xx_calibrate_decr,.set_rtc_time =
> -	    mpc8xx_set_rtc_time,.get_rtc_time = mpc8xx_get_rtc_time,};
> +	.name            = "MPC885 ADS",
> +	.probe           = mpc885ads_probe,
> +	.setup_arch      = mpc885ads_setup_arch,
> +	.init_IRQ        = m8xx_pic_init,
> +	.show_cpuinfo    = mpc8xx_show_cpuinfo,
> +	.get_irq         = mpc8xx_get_irq,
> +	.restart         = mpc8xx_restart,
> +	.calibrate_decr  = mpc8xx_calibrate_decr,
> +	.set_rtc_time    = mpc8xx_set_rtc_time,
> +	.get_rtc_time    = mpc8xx_get_rtc_time,
> +};
> 
>>From jk@xxxxxxxxxx Fri Sep 14 15:46:40 2007
> From: Jeremy Kerr <jk@xxxxxxxxxx>
> Subject: [PATCH 1/2] cell: Don't cast the result of of_get_property()
> Date: Fri, 14 Sep 2007 15:46:40 +1000
> X-Patchwork-ID: 13451
> 
> The cast to u32 * isn't required, of_get_property returns a void *.
> 
> Signed-off-by: Jeremy Kerr <jk@xxxxxxxxxx>
> 
> ---
>  arch/powerpc/platforms/cell/spu_manage.c |    4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
> 
> 
> ---
> diff --git a/arch/powerpc/platforms/cell/spu_manage.c b/arch/powerpc/platforms/cell/spu_manage.c
> index 0e14f53..1b01070 100644
> --- a/arch/powerpc/platforms/cell/spu_manage.c
> +++ b/arch/powerpc/platforms/cell/spu_manage.c
> @@ -377,10 +377,10 @@ static int qs20_reg_memory[QS20_SPES_PER_BE] = { 1, 1, 0, 0, 0, 0, 0, 0 };
>  static struct spu *spu_lookup_reg(int node, u32 reg)
>  {
>  	struct spu *spu;
> -	u32 *spu_reg;
> +	const u32 *spu_reg;
> 
>  	list_for_each_entry(spu, &cbe_spu_info[node].spus, cbe_list) {
> -		spu_reg = (u32*)of_get_property(spu_devnode(spu), "reg", NULL);
> +		spu_reg = of_get_property(spu_devnode(spu), "reg", NULL);
>  		if (*spu_reg == reg)
>  			return spu;
>  	}
> 
>>From arnd@xxxxxxxx Sat Sep 15 10:21:57 2007
> From: Arnd Bergmann <arnd@xxxxxxxx>
> Subject: add Kconfig option for optimizing for cell
> Date: Sat, 15 Sep 2007 10:21:57 +1000
> X-Patchwork-ID: 13485
> 
> Since the PPE on cell is an in-order core, it suffers significantly
> from wrong instruction scheduling.  This adds a Kconfig option that
> enables passing -mtune=cell to gcc in order to generate object
> code that runs well on cell.
> 
> Signed-off-by: Arnd Bergmann <arnd@xxxxxxxx>
> 
> ---
> diff --git a/arch/powerpc/Makefile b/arch/powerpc/Makefile
> index 6015a92..87aff53 100644
> --- a/arch/powerpc/Makefile
> +++ b/arch/powerpc/Makefile
> @@ -92,6 +92,10 @@ else
>  endif
>  endif
> 
> +ifeq ($(CONFIG_TUNE_CELL),y)
> +	CFLAGS += $(call cc-option,-mtune=cell)
> +endif
> +
>  # No AltiVec instruction when building kernel
>  CFLAGS += $(call cc-option,-mno-altivec)
> 
> diff --git a/arch/powerpc/platforms/Kconfig.cputype b/arch/powerpc/platforms/Kconfig.cputype
> index 86eb4cf..4c315be 100644
> --- a/arch/powerpc/platforms/Kconfig.cputype
> +++ b/arch/powerpc/platforms/Kconfig.cputype
> @@ -71,6 +71,18 @@ config POWER4
>  	depends on PPC64
>  	def_bool y
> 
> +config TUNE_CELL
> +	bool "Optimize for Cell Broadband Engine"
> +	depends on PPC64
> +	help
> +	  Cause the compiler to optimize for the PPE of the Cell Broadband
> +	  Engine. This will make the code run considerably faster on Cell
> +	  but somewhat slower on other machines. This option only changes
> +	  the scheduling of instructions, not the selection of instructions
> +	  itself, so the resulting kernel will keep running on all other
> +	  machines. When building a kernel that is supposed to run only
> +	  on Cell, you should also select the POWER4_ONLY option.
> +
>  config 6xx
>  	bool
> 
> 
>>From olof@xxxxxxxxx Tue Sep 18 06:12:29 2007
> From: Olof Johansson <olof@xxxxxxxxx>
> Subject: [POWERPC] Support setting affinity for U3/U4 MSI sources
> Date: Tue, 18 Sep 2007 06:12:29 +1000
> X-Patchwork-ID: 13547
> 
> Hook up affinity-setting for U3/U4 MSI interrupt sources.
> 
> Tested on Quad G5 with myri10ge.
> 
> Signed-off-by: Olof Johansson <olof@xxxxxxxxx>
> Acked-by: Benjamin Herrenschmidt <benh@xxxxxxxxxxxxxxxxxxx>
> Acked-by: Michael Ellerman <michael@xxxxxxxxxxxxxx>
> 
> ---
> diff --git a/arch/powerpc/sysdev/mpic.c b/arch/powerpc/sysdev/mpic.c
> index 8de29f2..22600fd 100644
> --- a/arch/powerpc/sysdev/mpic.c
> +++ b/arch/powerpc/sysdev/mpic.c
> @@ -768,7 +768,7 @@ static void mpic_end_ipi(unsigned int irq)
> 
>  #endif /* CONFIG_SMP */
> 
> -static void mpic_set_affinity(unsigned int irq, cpumask_t cpumask)
> +void mpic_set_affinity(unsigned int irq, cpumask_t cpumask)
>  {
>  	struct mpic *mpic = mpic_from_irq(irq);
>  	unsigned int src = mpic_irq_to_hw(irq);
> diff --git a/arch/powerpc/sysdev/mpic.h b/arch/powerpc/sysdev/mpic.h
> index 3a1c3d2..1cb6bd8 100644
> --- a/arch/powerpc/sysdev/mpic.h
> +++ b/arch/powerpc/sysdev/mpic.h
> @@ -34,5 +34,6 @@ extern int mpic_set_irq_type(unsigned int virq, unsigned int flow_type);
>  extern void mpic_end_irq(unsigned int irq);
>  extern void mpic_mask_irq(unsigned int irq);
>  extern void mpic_unmask_irq(unsigned int irq);
> +extern void mpic_set_affinity(unsigned int irq, cpumask_t cpumask);
> 
>  #endif /* _POWERPC_SYSDEV_MPIC_H */
> diff --git a/arch/powerpc/sysdev/mpic_u3msi.c b/arch/powerpc/sysdev/mpic_u3msi.c
> index 305b864..0fc4e96 100644
> --- a/arch/powerpc/sysdev/mpic_u3msi.c
> +++ b/arch/powerpc/sysdev/mpic_u3msi.c
> @@ -40,6 +40,7 @@ static struct irq_chip mpic_u3msi_chip = {
>  	.unmask		= mpic_u3msi_unmask_irq,
>  	.eoi		= mpic_end_irq,
>  	.set_type	= mpic_set_irq_type,
> +	.set_affinity	= mpic_set_affinity,
>  	.typename	= "MPIC-U3MSI",
>  };
> 
> 
>>From satyam@xxxxxxxxxxxxx Tue Sep 18 09:43:40 2007
> From: Satyam Sharma <satyam@xxxxxxxxxxxxx>
> Subject: Avoid pointless WARN_ON(irqs_disabled()) from panic codepath
> Date: Tue, 18 Sep 2007 09:43:40 +1000
> X-Patchwork-ID: 13552
> 
>> ------------[ cut here ]------------
>> Badness at arch/powerpc/kernel/smp.c:202
> 
> comes when smp_call_function_map() has been called with irqs disabled,
> which is illegal. However, there is a special case, the panic() codepath,
> when we do not want to warn about this -- warning at that time is pointless
> anyway, and only serves to scroll away the *real* cause of the panic and
> distracts from the real bug.
> 
> * So let's extract the WARN_ON() from smp_call_function_map() into all its
>   callers -- smp_call_function() and smp_call_function_single()
> 
> * Also, introduce another caller of smp_call_function_map(), namely
>   __smp_call_function() (and make smp_call_function() a wrapper over this)
>   which does *not* warn about disabled irqs
> 
> * Use this __smp_call_function() from the panic codepath's smp_send_stop()
> 
> We also end having to move code of smp_send_stop() below the definition
> of __smp_call_function().
> 
> Signed-off-by: Satyam Sharma <satyam@xxxxxxxxxxxxx>
> 
> ---
> 
> Untested (not even compile-tested) patch.
> Could someone point me to ppc32/64 cross-compilers for i386?
> 
>  arch/powerpc/kernel/smp.c |   27 ++++++++++++++++++---------
>  1 files changed, 18 insertions(+), 9 deletions(-)
> 
> 
> ---
> diff --git a/arch/powerpc/kernel/smp.c b/arch/powerpc/kernel/smp.c
> index 1ea4316..b24dcba 100644
> --- a/arch/powerpc/kernel/smp.c
> +++ b/arch/powerpc/kernel/smp.c
> @@ -152,11 +152,6 @@ static void stop_this_cpu(void *dummy)
>  		;
>  }
> 
> -void smp_send_stop(void)
> -{
> -	smp_call_function(stop_this_cpu, NULL, 1, 0);
> -}
> -
>  /*
>   * Structure and data for smp_call_function(). This is designed to minimise
>   * static memory requirements. It also looks cleaner.
> @@ -198,9 +193,6 @@ int smp_call_function_map(void (*func) (void *info), void *info, int nonatomic,
>  	int cpu;
>  	u64 timeout;
> 
> -	/* Can deadlock when called with interrupts disabled */
> -	WARN_ON(irqs_disabled());
> -
>  	if (unlikely(smp_ops == NULL))
>  		return ret;
> 
> @@ -270,10 +262,19 @@ int smp_call_function_map(void (*func) (void *info), void *info, int nonatomic,
>  	return ret;
>  }
> 
> +static int __smp_call_function(void (*func)(void *info), void *info,
> +			       int nonatomic, int wait)
> +{
> +	return smp_call_function_map(func,info,nonatomic,wait,cpu_online_map);
> +}
> +
>  int smp_call_function(void (*func) (void *info), void *info, int nonatomic,
>  			int wait)
>  {
> -	return smp_call_function_map(func,info,nonatomic,wait,cpu_online_map);
> +	/* Can deadlock when called with interrupts disabled */
> +	WARN_ON(irqs_disabled());
> +
> +	return __smp_call_function(func, info, nonatomic, wait);
>  }
>  EXPORT_SYMBOL(smp_call_function);
> 
> @@ -283,6 +284,9 @@ int smp_call_function_single(int cpu, void (*func) (void *info), void *info, int
>  	cpumask_t map = CPU_MASK_NONE;
>  	int ret = 0;
> 
> +	/* Can deadlock when called with interrupts disabled */
> +	WARN_ON(irqs_disabled());
> +
>  	if (!cpu_online(cpu))
>  		return -EINVAL;
> 
> @@ -299,6 +303,11 @@ int smp_call_function_single(int cpu, void (*func) (void *info), void *info, int
>  }
>  EXPORT_SYMBOL(smp_call_function_single);
> 
> +void smp_send_stop(void)
> +{
> +	__smp_call_function(stop_this_cpu, NULL, 1, 0);
> +}
> +
>  void smp_call_function_interrupt(void)
>  {
>  	void (*func) (void *info);
> 
>>From benh@xxxxxxxxxxxxxxxxxxx Wed Sep 19 14:50:22 2007
> From: Benjamin Herrenschmidt <benh@xxxxxxxxxxxxxxxxxxx>
> Subject: Fix platinumfb framebuffer
> Date: Wed, 19 Sep 2007 14:50:22 +1000
> X-Patchwork-ID: 13599
> 
> Current kernels have a non-working platinumfb due to some resource
> management issues.  This fixes it.
> 
> Signed-off-by: Benjamin Herrenschmidt <benh@xxxxxxxxxxxxxxxxxxx>
> ---
> 
> Note: platinumfb is a powermac only driver
> 
> 
> ---
> Index: linux-work/drivers/video/platinumfb.c
> ===================================================================
> --- linux-work.orig/drivers/video/platinumfb.c	2007-09-19 14:21:42.000000000 +1000
> +++ linux-work/drivers/video/platinumfb.c	2007-09-19 14:47:11.000000000 +1000
> @@ -17,6 +17,8 @@
>   *  more details.
>   */
> 
> +#undef DEBUG
> +
>  #include <linux/module.h>
>  #include <linux/kernel.h>
>  #include <linux/errno.h>
> @@ -535,33 +537,35 @@ static int __devinit platinumfb_probe(st
>  	volatile __u8		*fbuffer;
>  	int			bank0, bank1, bank2, bank3, rc;
> 
> -	printk(KERN_INFO "platinumfb: Found Apple Platinum video hardware\n");
> +	dev_info(&odev->dev, "Found Apple Platinum video hardware\n");
> 
>  	info = framebuffer_alloc(sizeof(*pinfo), &odev->dev);
> -	if (info == NULL)
> +	if (info == NULL) {
> +		dev_err(&odev->dev, "Failed to allocate fbdev !\n");
>  		return -ENOMEM;
> +	}
>  	pinfo = info->par;
> 
>  	if (of_address_to_resource(dp, 0, &pinfo->rsrc_reg) ||
>  	    of_address_to_resource(dp, 1, &pinfo->rsrc_fb)) {
> -		printk(KERN_ERR "platinumfb: Can't get resources\n");
> -		framebuffer_release(info);
> -		return -ENXIO;
> -	}
> -	if (!request_mem_region(pinfo->rsrc_reg.start,
> -				pinfo->rsrc_reg.start -
> -				pinfo->rsrc_reg.end + 1,
> -				"platinumfb registers")) {
> +		dev_err(&odev->dev, "Can't get resources\n");
>  		framebuffer_release(info);
>  		return -ENXIO;
>  	}
> +	dev_dbg(&odev->dev, " registers  : 0x%llx...0x%llx\n",
> +		(unsigned long long)pinfo->rsrc_reg.start,
> +		(unsigned long long)pinfo->rsrc_reg.end);
> +	dev_dbg(&odev->dev, " framebuffer: 0x%llx...0x%llx\n",
> +		(unsigned long long)pinfo->rsrc_fb.start,
> +		(unsigned long long)pinfo->rsrc_fb.end);
> +
> +	/* Do not try to request register space, they overlap with the
> +	 * northbridge and that can fail. Only request framebuffer
> +	 */
>  	if (!request_mem_region(pinfo->rsrc_fb.start,
> -				pinfo->rsrc_fb.start
> -				- pinfo->rsrc_fb.end + 1,
> +				pinfo->rsrc_fb.end - pinfo->rsrc_fb.start + 1,
>  				"platinumfb framebuffer")) {
> -		release_mem_region(pinfo->rsrc_reg.start,
> -				   pinfo->rsrc_reg.end -
> -				   pinfo->rsrc_reg.start + 1);
> +		printk(KERN_ERR "platinumfb: Can't request framebuffer !\n");
>  		framebuffer_release(info);
>  		return -ENXIO;
>  	}
> @@ -600,7 +604,8 @@ static int __devinit platinumfb_probe(st
>  	bank2 = fbuffer[0x200000] == 0x56;
>  	bank3 = fbuffer[0x300000] == 0x78;
>  	pinfo->total_vram = (bank0 + bank1 + bank2 + bank3) * 0x100000;
> -	printk(KERN_INFO "platinumfb: Total VRAM = %dMB (%d%d%d%d)\n", (int) (pinfo->total_vram / 1024 / 1024),
> +	printk(KERN_INFO "platinumfb: Total VRAM = %dMB (%d%d%d%d)\n",
> +	       (unsigned int) (pinfo->total_vram / 1024 / 1024),
>  	       bank3, bank2, bank1, bank0);
> 
>  	/*
> @@ -644,16 +649,15 @@ static int __devexit platinumfb_remove(s
>          unregister_framebuffer (info);
>  	
>  	/* Unmap frame buffer and registers */
> +	iounmap(pinfo->frame_buffer);
> +	iounmap(pinfo->platinum_regs);
> +	iounmap(pinfo->cmap_regs);
> +
>  	release_mem_region(pinfo->rsrc_fb.start,
>  			   pinfo->rsrc_fb.end -
>  			   pinfo->rsrc_fb.start + 1);
> -	release_mem_region(pinfo->rsrc_reg.start,
> -			   pinfo->rsrc_reg.end -
> -			   pinfo->rsrc_reg.start + 1);
> -	iounmap(pinfo->frame_buffer);
> -	iounmap(pinfo->platinum_regs);
> +
>  	release_mem_region(pinfo->cmap_regs_phys, 0x1000);
> -	iounmap(pinfo->cmap_regs);
> 
>  	framebuffer_release(info);
> 
> 
>>From Emilian.Medve@xxxxxxxxxxxxx Thu Sep 20 12:25:17 2007
> From: Emil Medve <Emilian.Medve@xxxxxxxxxxxxx>
> Subject: [PATCH v3] [POWERPC] Fix build errors when BLOCK=n
> Date: Thu, 20 Sep 2007 12:25:17 +1000
> X-Patchwork-ID: 13617
> 
> These are the symptom error messages:
> 
>   CC      arch/powerpc/kernel/setup_32.o
> In file included from include/linux/blkdev.h:17,
>                  from include/linux/ide.h:13,
>                  from arch/powerpc/kernel/setup_32.c:13:
> include/linux/bsg.h:67: warning: 'struct request_queue' declared inside parameter list
> include/linux/bsg.h:67: warning: its scope is only this definition or declaration, which is probably not what you want
> include/linux/bsg.h:71: warning: 'struct request_queue' declared inside parameter list
> In file included from arch/powerpc/kernel/setup_32.c:13:
> include/linux/ide.h:857: error: field 'wrq' has incomplete type
> 
>   CC      arch/powerpc/kernel/ppc_ksyms.o
> In file included from include/linux/blkdev.h:17,
>                  from include/linux/ide.h:13,
>                  from arch/powerpc/kernel/ppc_ksyms.c:15:
> include/linux/bsg.h:67: warning: 'struct request_queue' declared inside parameter list
> include/linux/bsg.h:67: warning: its scope is only this definition or declaration, which is probably not what you want
> include/linux/bsg.h:71: warning: 'struct request_queue' declared inside parameter list
> In file included from arch/powerpc/kernel/ppc_ksyms.c:15:
> include/linux/ide.h:857: error: field 'wrq' has incomplete type
> 
> The fix tries to use the smallest scope CONFIG_* symbols that will fix
> the build problem.  In this case <linux/ide.h> needs to be included
> only if IDE=y or IDE=m were selected.  Also, ppc_ide_md is needed only
> if BLK_DEV_IDE=y or BLK_DEV_IDE=m
> 
> Moved the EXPORT_SYMBOL(ppc_ide_md) from ppc_ksysms.c next to its
> declaration in setup_32.c which made <linux/ide.h> not needed. With
> <linux/ide.h> gone from ppc_ksyms.c, <asm/cacheflush.h> is needed to
> address the following warnings and errors:
> 
>   CC      arch/powerpc/kernel/ppc_ksyms.o
> arch/powerpc/kernel/ppc_ksyms.c:122: error: '__flush_icache_range' undeclared here (not in a function)
> arch/powerpc/kernel/ppc_ksyms.c:122: warning: type defaults to 'int' in declaration of '__flush_icache_range'
> arch/powerpc/kernel/ppc_ksyms.c:123: error: 'flush_dcache_range' undeclared here (not in a function)
> arch/powerpc/kernel/ppc_ksyms.c:123: warning: type defaults to 'int' in declaration of 'flush_dcache_range'
> 
> Signed-off-by: Emil Medve <Emilian.Medve@xxxxxxxxxxxxx>
> ---
> 
> I tested that the code builds with this patch in various combinations of
> configuration options: all the combinations involving BLOCK, IDE and BLK_DEV_IDE
> 
> A patch for the warnings above has been already commited here: http://git.kernel.org/?p=linux/kernel/git/jejb/scsi-misc-2.6.git;a=commitdiff;h=49892223f7d3a2333ef9e6cbdd526676e1fc517a
> 
> This patch is against Paul's tree (75cdff9242c4e048cb830d359920719d29b9ee7c)
> 
> powerpc> scripts/checkpatch.pl 0001-POWERPC-Fix-build-errors-when-BLOCK-n.patch
> Your patch has no obvious style problems and is ready for submission.
> 
>  arch/powerpc/kernel/ppc_ksyms.c |    6 +-----
>  arch/powerpc/kernel/setup_32.c  |    5 +++++
>  2 files changed, 6 insertions(+), 5 deletions(-)
> 
> 
> 
> ---
> diff --git a/arch/powerpc/kernel/ppc_ksyms.c b/arch/powerpc/kernel/ppc_ksyms.c
> index 430c502..c6b1aa3 100644
> --- a/arch/powerpc/kernel/ppc_ksyms.c
> +++ b/arch/powerpc/kernel/ppc_ksyms.c
> @@ -12,12 +12,12 @@
>  #include <linux/irq.h>
>  #include <linux/pci.h>
>  #include <linux/delay.h>
> -#include <linux/ide.h>
>  #include <linux/bitops.h>
> 
>  #include <asm/page.h>
>  #include <asm/semaphore.h>
>  #include <asm/processor.h>
> +#include <asm/cacheflush.h>
>  #include <asm/uaccess.h>
>  #include <asm/io.h>
>  #include <asm/atomic.h>
> @@ -95,10 +95,6 @@ EXPORT_SYMBOL(__strnlen_user);
>  EXPORT_SYMBOL(copy_4K_page);
>  #endif
> 
> -#if defined(CONFIG_PPC32) && (defined(CONFIG_BLK_DEV_IDE) || defined(CONFIG_BLK_DEV_IDE_MODULE))
> -EXPORT_SYMBOL(ppc_ide_md);
> -#endif
> -
>  #if defined(CONFIG_PCI) && defined(CONFIG_PPC32)
>  EXPORT_SYMBOL(isa_io_base);
>  EXPORT_SYMBOL(isa_mem_base);
> diff --git a/arch/powerpc/kernel/setup_32.c b/arch/powerpc/kernel/setup_32.c
> index a288a5f..7474502 100644
> --- a/arch/powerpc/kernel/setup_32.c
> +++ b/arch/powerpc/kernel/setup_32.c
> @@ -10,7 +10,9 @@
>  #include <linux/reboot.h>
>  #include <linux/delay.h>
>  #include <linux/initrd.h>
> +#if defined(CONFIG_IDE) || defined(CONFIG_IDE_MODULE)
>  #include <linux/ide.h>
> +#endif
>  #include <linux/tty.h>
>  #include <linux/bootmem.h>
>  #include <linux/seq_file.h>
> @@ -49,7 +51,10 @@
> 
>  extern void bootx_init(unsigned long r4, unsigned long phys);
> 
> +#if defined(CONFIG_BLK_DEV_IDE) || defined(CONFIG_BLK_DEV_IDE_MODULE)
>  struct ide_machdep_calls ppc_ide_md;
> +EXPORT_SYMBOL(ppc_ide_md);
> +#endif
> 
>  int boot_cpuid;
>  EXPORT_SYMBOL_GPL(boot_cpuid);
> 
> -
> To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
> the body of a message to majordomo@xxxxxxxxxxxxxxx
> More majordomo info at  http://vger.kernel.org/majordomo-info.html


-- 
Brian King
Linux on Power Virtualization
IBM Linux Technology Center
-
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [SCSI Target Devel]     [Linux SCSI Target Infrastructure]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Linux IIO]     [Samba]     [Device Mapper]
  Powered by Linux