static void handle_stsi_3_2_2(struct kvm_vcpu *vcpu, struct sysinfo_3_2_2 *mem) { struct kvm_s390_float_interrupt *fi = &vcpu->kvm->arch.float_int; int cpus = 0; int n; spin_lock(&fi->lock); for (n = 0; n < KVM_MAX_VCPUS; n++) if (fi->local_int[n]) cpus++; spin_unlock(&fi->lock); /* deal with other level 3 hypervisors */ if (stsi(mem, 3, 2, 2) == -ENOSYS) mem->count = 0; if (mem->count < 8) mem->count++; for (n = mem->count - 1; n > 0 ; n--) memcpy(&mem->vm[n], &mem->vm[n - 1], sizeof(mem->vm[0])); mem->vm[0].cpus_total = cpus; mem->vm[0].cpus_configured = cpus; mem->vm[0].cpus_standby = 0; mem->vm[0].cpus_reserved = 0; mem->vm[0].caf = 1000; memcpy(mem->vm[0].name, "KVMguest", 8); ASCEBC(mem->vm[0].name, 8); memcpy(mem->vm[0].cpi, "KVM/Linux ", 16); ASCEBC(mem->vm[0].cpi, 16); }
int zfcp_qdio_allocate(struct zfcp_adapter *adapter) { struct qdio_initialize *init_data; init_data = &adapter->qdio_init_data; init_data->cdev = adapter->ccw_device; init_data->q_format = QDIO_SCSI_QFMT; memcpy(init_data->adapter_name, zfcp_get_busid_by_adapter(adapter), 8); ASCEBC(init_data->adapter_name, 8); init_data->qib_param_field_format = 0; init_data->qib_param_field = NULL; init_data->input_slib_elements = NULL; init_data->output_slib_elements = NULL; init_data->min_input_threshold = ZFCP_MIN_INPUT_THRESHOLD; init_data->max_input_threshold = ZFCP_MAX_INPUT_THRESHOLD; init_data->min_output_threshold = ZFCP_MIN_OUTPUT_THRESHOLD; init_data->max_output_threshold = ZFCP_MAX_OUTPUT_THRESHOLD; init_data->no_input_qs = 1; init_data->no_output_qs = 1; init_data->input_handler = zfcp_qdio_response_handler; init_data->output_handler = zfcp_qdio_request_handler; init_data->int_parm = (unsigned long) adapter; init_data->flags = QDIO_INBOUND_0COPY_SBALS | QDIO_OUTBOUND_0COPY_SBALS | QDIO_USE_OUTBOUND_PCIS; init_data->input_sbal_addr_array = (void **) (adapter->response_queue.buffer); init_data->output_sbal_addr_array = (void **) (adapter->request_queue.buffer); return qdio_allocate(init_data); }
static ssize_t qeth_dev_portname_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { struct qeth_card *card = dev_get_drvdata(dev); char *tmp; int i, rc = 0; if (!card) return -EINVAL; mutex_lock(&card->conf_mutex); if ((card->state != CARD_STATE_DOWN) && (card->state != CARD_STATE_RECOVER)) { rc = -EPERM; goto out; } tmp = strsep((char **) &buf, "\n"); if ((strlen(tmp) > 8) || (strlen(tmp) == 0)) { rc = -EINVAL; goto out; } card->info.portname[0] = strlen(tmp); /* for beauty reasons */ for (i = 1; i < 9; i++) card->info.portname[i] = ' '; strcpy(card->info.portname + 1, tmp); ASCEBC(card->info.portname + 1, 8); out: mutex_unlock(&card->conf_mutex); return rc ? rc : count; }
/** * zfcp_qdio_allocate - allocate queue memory and initialize QDIO data * @adapter: pointer to struct zfcp_adapter * Returns: -ENOMEM on memory allocation error or return value from * qdio_allocate */ int zfcp_qdio_allocate(struct zfcp_adapter *adapter) { struct qdio_initialize *init_data; if (zfcp_qdio_buffers_enqueue(adapter->req_q.sbal) || zfcp_qdio_buffers_enqueue(adapter->resp_q.sbal)) return -ENOMEM; init_data = &adapter->qdio_init_data; init_data->cdev = adapter->ccw_device; init_data->q_format = QDIO_ZFCP_QFMT; memcpy(init_data->adapter_name, zfcp_get_busid_by_adapter(adapter), 8); ASCEBC(init_data->adapter_name, 8); init_data->qib_param_field_format = 0; init_data->qib_param_field = NULL; init_data->input_slib_elements = NULL; init_data->output_slib_elements = NULL; init_data->no_input_qs = 1; init_data->no_output_qs = 1; init_data->input_handler = zfcp_qdio_int_resp; init_data->output_handler = zfcp_qdio_int_req; init_data->int_parm = (unsigned long) adapter; init_data->flags = QDIO_INBOUND_0COPY_SBALS | QDIO_OUTBOUND_0COPY_SBALS | QDIO_USE_OUTBOUND_PCIS; init_data->input_sbal_addr_array = (void **) (adapter->resp_q.sbal); init_data->output_sbal_addr_array = (void **) (adapter->req_q.sbal); return qdio_allocate(init_data); }
/* * Create the 8 bytes EBCDIC DCSS segment name from * an ASCII name, incl. padding */ static void dcss_mkname(char *ascii_name, char *ebcdic_name) { int i; for (i = 0; i < 8; i++) { if (ascii_name[i] == '\0') break; ebcdic_name[i] = toupper(ascii_name[i]); }; for (; i < 8; i++) ebcdic_name[i] = ' '; ASCEBC(ebcdic_name, 8); }
static void ext_to_int_kekl(struct tape390_kekl *in, struct tape3592_kekl *out) { int i; memset(out, 0, sizeof(*out)); if (in->type == TAPE390_KEKL_TYPE_HASH) out->flags |= 0x40; if (in->type_on_tape == TAPE390_KEKL_TYPE_HASH) out->flags |= 0x80; strncpy(out->label, in->label, 64); for (i = strlen(in->label); i < sizeof(out->label); i++) out->label[i] = ' '; ASCEBC(out->label, sizeof(out->label)); }
struct dasd_ccw_req * dasd_alloc_erp_request(char *magic, int cplength, int datasize, struct dasd_device * device) { unsigned long flags; struct dasd_ccw_req *cqr; char *data; int size; /* Sanity checks */ BUG_ON( magic == NULL || datasize > PAGE_SIZE || (cplength*sizeof(struct ccw1)) > PAGE_SIZE); size = (sizeof(struct dasd_ccw_req) + 7L) & -8L; if (cplength > 0) size += cplength * sizeof(struct ccw1); if (datasize > 0) size += datasize; spin_lock_irqsave(&device->mem_lock, flags); cqr = (struct dasd_ccw_req *) dasd_alloc_chunk(&device->erp_chunks, size); spin_unlock_irqrestore(&device->mem_lock, flags); if (cqr == NULL) return ERR_PTR(-ENOMEM); memset(cqr, 0, sizeof(struct dasd_ccw_req)); INIT_LIST_HEAD(&cqr->devlist); INIT_LIST_HEAD(&cqr->blocklist); data = (char *) cqr + ((sizeof(struct dasd_ccw_req) + 7L) & -8L); cqr->cpaddr = NULL; if (cplength > 0) { cqr->cpaddr = (struct ccw1 *) data; data += cplength*sizeof(struct ccw1); memset(cqr->cpaddr, 0, cplength*sizeof(struct ccw1)); } cqr->data = NULL; if (datasize > 0) { cqr->data = data; memset(cqr->data, 0, datasize); } strncpy((char *) &cqr->magic, magic, 4); ASCEBC((char *) &cqr->magic, 4); set_bit(DASD_CQR_FLAGS_USE_ERP, &cqr->flags); dasd_get_device(device); return cqr; }
static void zfcp_qdio_setup_init_data(struct qdio_initialize *id, struct zfcp_qdio *qdio) { memset(id, 0, sizeof(*id)); id->cdev = qdio->adapter->ccw_device; id->q_format = QDIO_ZFCP_QFMT; memcpy(id->adapter_name, dev_name(&id->cdev->dev), 8); ASCEBC(id->adapter_name, 8); id->no_input_qs = 1; id->no_output_qs = 1; id->input_handler = zfcp_qdio_int_resp; id->output_handler = zfcp_qdio_int_req; id->int_parm = (unsigned long) qdio; id->flags = QDIO_INBOUND_0COPY_SBALS | QDIO_OUTBOUND_0COPY_SBALS | QDIO_USE_OUTBOUND_PCIS; id->input_sbal_addr_array = (void **) (qdio->resp_q.sbal); id->output_sbal_addr_array = (void **) (qdio->req_q.sbal); }
static void zfcp_qdio_setup_init_data(struct qdio_initialize *id, struct zfcp_qdio *qdio) { memset(id, 0, sizeof(*id)); id->cdev = qdio->adapter->ccw_device; id->q_format = QDIO_ZFCP_QFMT; memcpy(id->adapter_name, dev_name(&id->cdev->dev), 8); ASCEBC(id->adapter_name, 8); id->qib_rflags = QIB_RFLAGS_ENABLE_DATA_DIV; id->no_input_qs = 1; id->no_output_qs = 1; id->input_handler = zfcp_qdio_int_resp; id->output_handler = zfcp_qdio_int_req; id->int_parm = (unsigned long) qdio; id->input_sbal_addr_array = (void **) (qdio->res_q); id->output_sbal_addr_array = (void **) (qdio->req_q); id->scan_threshold = QDIO_MAX_BUFFERS_PER_Q - ZFCP_QDIO_MAX_SBALS_PER_REQ * 2; }
/* * String write routine for 3215 devices */ static void raw3215_write(struct raw3215_info *raw, const char *str, unsigned int length) { unsigned long flags; int c, count; while (length > 0) { spin_lock_irqsave(get_ccwdev_lock(raw->cdev), flags); count = (length > RAW3215_BUFFER_SIZE) ? RAW3215_BUFFER_SIZE : length; length -= count; raw3215_make_room(raw, count); /* copy string to output buffer and convert it to EBCDIC */ while (1) { c = min_t(int, count, min(RAW3215_BUFFER_SIZE - raw->count, RAW3215_BUFFER_SIZE - raw->head)); if (c <= 0) break; memcpy(raw->buffer + raw->head, str, c); ASCEBC(raw->buffer + raw->head, c); raw->head = (raw->head + c) & (RAW3215_BUFFER_SIZE - 1); raw->count += c; raw->line_pos += c; str += c; count -= c; } if (!(raw->flags & RAW3215_WORKING)) { raw3215_mk_write_req(raw); /* start or queue request */ raw3215_try_io(raw); } spin_unlock_irqrestore(get_ccwdev_lock(raw->cdev), flags); } }
/* * String write routine for 3215 devices */ static int raw3215_write(raw3215_info *raw, const char *str, int from_user, unsigned int length) { unsigned long flags; int ret, c; int count; ret = 0; while (length > 0) { s390irq_spin_lock_irqsave(raw->irq, flags); count = (length > RAW3215_BUFFER_SIZE) ? RAW3215_BUFFER_SIZE : length; length -= count; raw3215_make_room(raw, count); /* copy string to output buffer and convert it to EBCDIC */ if (from_user) { while (1) { c = MIN(count, MIN(RAW3215_BUFFER_SIZE - raw->count, RAW3215_BUFFER_SIZE - raw->head)); if (c <= 0) break; c -= copy_from_user(raw->buffer + raw->head, str, c); if (c == 0) { if (!ret) ret = -EFAULT; break; } ASCEBC(raw->buffer + raw->head, c); raw->head = (raw->head + c) & (RAW3215_BUFFER_SIZE - 1); raw->count += c; raw->line_pos += c; str += c; count -= c; ret += c; } } else { while (1) { c = MIN(count, MIN(RAW3215_BUFFER_SIZE - raw->count, RAW3215_BUFFER_SIZE - raw->head)); if (c <= 0) break; memcpy(raw->buffer + raw->head, str, c); ASCEBC(raw->buffer + raw->head, c); raw->head = (raw->head + c) & (RAW3215_BUFFER_SIZE - 1); raw->count += c; raw->line_pos += c; str += c; count -= c; ret += c; } } if (!(raw->flags & RAW3215_WORKING)) { raw3215_mk_write_req(raw); /* start or queue request */ raw3215_try_io(raw); } s390irq_spin_unlock_irqrestore(raw->irq, flags); } return ret; }
/* * ccw_req_t *ccw_alloc_request ( int cplength, int datasize ) * allocates a ccw_req_t, that * - can hold a CP of cplength CCWS * - can hold additional data up to datasize */ ccw_req_t * ccw_alloc_request ( char *magic, int cplength, int datasize ) { ccw_req_t * request = NULL; int size_needed; int data_offset, ccw_offset; int cachind; /* Sanity checks */ if ( magic == NULL || datasize > PAGE_SIZE || cplength == 0 || (cplength*sizeof(ccw1_t)) > PAGE_SIZE) BUG(); debug_text_event ( debug_area, 1, "ALLC"); debug_text_event ( debug_area, 1, magic); debug_int_event ( debug_area, 1, cplength); debug_int_event ( debug_area, 1, datasize); /* We try to keep things together in memory */ size_needed = (sizeof (ccw_req_t) + 7) & -8; data_offset = ccw_offset = 0; if (size_needed + datasize <= PAGE_SIZE) { /* Keep data with the request */ data_offset = size_needed; size_needed += (datasize + 7) & -8; } if (size_needed + cplength*sizeof(ccw1_t) <= PAGE_SIZE) { /* Keep CCWs with request */ ccw_offset = size_needed; size_needed += cplength*sizeof(ccw1_t); } /* determine cache index for the requested size */ for (cachind = 0; cachind < CCW_NUMBER_CACHES; cachind ++ ) if ( size_needed < (SMALLEST_SLAB << cachind) ) break; /* Try to fulfill the request from a cache */ if ( ccw_cache[cachind] == NULL ) BUG(); request = kmem_cache_alloc ( ccw_cache[cachind], CCW_CACHE_TYPE ); if (request == NULL) return NULL; memset ( request, 0, (SMALLEST_SLAB << cachind)); request->cache = ccw_cache[cachind]; /* Allocate memory for the extra data */ if (data_offset == 0) { /* Allocated memory for extra data with kmalloc */ request->data = (void *) kmalloc(datasize, CCW_CACHE_TYPE ); if (request->data == NULL) { printk(KERN_WARNING PRINTK_HEADER "Couldn't allocate data area\n"); kmem_cache_free(request->cache, request); return NULL; } } else /* Extra data already allocated with the request */ request->data = (void *) ((addr_t) request + data_offset); /* Allocate memory for the channel program */ if (ccw_offset == 0) { /* Allocated memory for the channel program with kmalloc */ request->cpaddr = (ccw1_t *) kmalloc(cplength*sizeof(ccw1_t), CCW_CACHE_TYPE); if (request->cpaddr == NULL) { printk (KERN_DEBUG PRINTK_HEADER "Couldn't allocate ccw area\n"); if (data_offset == 0) kfree(request->data); kmem_cache_free(request->cache, request); return NULL; } } else /* Channel program already allocated with the request */ request->cpaddr = (ccw1_t *) ((addr_t) request + ccw_offset); memset ( request->data, 0, datasize ); memset ( request->cpaddr, 0, cplength*sizeof(ccw1_t) ); strncpy ( (char *)(&request->magic), magic, 4); ASCEBC((char *)(&request->magic),4); request -> cplength = cplength; request -> datasize = datasize; /* enqueue request to list of allocated requests */ enchain(request); debug_int_event ( debug_area, 1, (long)request); return request; }